-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathauth.go
70 lines (63 loc) · 1.79 KB
/
auth.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package goinside
import (
"crypto/sha256"
"encoding/json"
"errors"
"fmt"
"time"
)
// App 구조체는 AppKey와 AppId를 구성합니다.
type App struct {
Token string
ID string
}
// AppIDResponse 구조체는 appKeyVerificationAPI 요청의 응답을 정의합니다.
type AppIDResponse []struct {
Result bool `json:"result"`
AppID string `json:"app_id"`
Cause string `json:"cause"`
}
func fetchAppID(s session) (valueToken, appID string, err error) {
valueToken, err = generateValueToken()
if err != nil {
return "", "", err
}
r, ct := multipartForm(map[string]string{
"value_token": valueToken,
"signature": "ReOo4u96nnv8Njd7707KpYiIVYQ3FlcKHDJE046Pg6s=",
"pkg": "com.dcinside.app",
// "vCode": "?",
// "vName": "?",
})
res, err := appKeyVerificationAPI.post(s, r, ct)
if err != nil {
return "", "", err
}
defer res.Body.Close()
appIDResponse := AppIDResponse{}
if err := json.NewDecoder(res.Body).Decode(&appIDResponse); err != nil {
return "", "", err
}
if len(appIDResponse) == 0 || appIDResponse[0].Result == false {
return "", "", fmt.Errorf("could not fetch app id: %v", appIDResponse[0].Cause)
}
appID = appIDResponse[0].AppID
time.Sleep(time.Second * 5)
return
}
func generateValueToken() (string, error) {
resp, err := appCheckAPI.getWithoutHash()
if err != nil {
return "", fmt.Errorf("appCheckAPI.getWithoutHash fail: %v", err)
}
body := []map[string]interface{}{}
if err := json.NewDecoder(resp.Body).Decode(&body); err != nil {
return "", fmt.Errorf("appCheckAPI json decode fail: %v", err)
}
if len(body) != 1 {
return "", errors.New("unknown app check response")
}
appKey := fmt.Sprintf("dcArdchk_%s", body[0]["date"])
hashedAppKey := sha256.Sum256([]byte(appKey))
return fmt.Sprintf("%x", hashedAppKey), nil
}