Golang实现阿里云盘扫码登录及登录凭证刷新
本文仅做记录,参考价值不大,推荐参考
获取会话ID
func authAuthorize() (sessionId *http.Cookie, err error) {
inter := "https://auth.aliyundrive.com/v2/oauth/authorize"
params := map[string]string{
"login_type": "custom",
"response_type": "code",
"redirect_uri": "https://www.aliyundrive.com/sign/callback",
"client_id": "25dzX3vbYqktVxyX",
"state": `{"origin":"file://"}`,
}
res, err := get(Request{
Url: inter,
Params: params,
})
if err != nil {
return
}
for _, cookie := range res.Cookies() {
if cookie.Name == "SESSIONID" {
return cookie, nil
}
}
return nil, ErrSessionId
}
获取二维码
func (ali *AliClient) QrcodeGenerate() (qrData QrCodeData, err error) {
sessionId, err := authAuthorize()
if err != nil {
return
}
ali.Cookies = append(ali.Cookies, sessionId)
inter := PASSPORT_HOST + NEWLOGIN_QRCODE_GENERATE_DO
res, err := ali.get(Request{
Url: inter,
Params: UniParams,
})
if err != nil {
return
}
body, err := io.ReadAll(res.Body)
if err != nil {
return
}
qrDataStr := gjson.GetBytes(body, "content.data").String()
err = json.Unmarshal([]byte(qrDataStr), &qrData)
if err != nil {
return
}
if qrData.CodeContent == "" {
err = ErrQrCode
}
return
}
检查二维码状态
func (ali *AliClient) QrcodeCheck(qrCodeData QrCodeData) (refreshToken string, err error) {
inter := PASSPORT_HOST + NEWLOGIN_QRCODE_QUERY_DO
data, err := StructToMapString(qrCodeData)
if err != nil {
return
}
res, err := ali.post(Request{
Url: inter,
Params: UniParams,
Data: data,
})
if err != nil {
return
}
body, err := io.ReadAll(res.Body)
if err != nil {
return
}
qrCodeStatus := gjson.GetBytes(body, "content.data.qrCodeStatus").String()
switch qrCodeStatus {
case "NEW":
err = ErrQrCodeNew
case "SCANED":
err = ErrQrCodeSCANED
case "EXPIRED":
err = ErrQrCodeEXPIRED
case "CONFIRMED":
// 已确认
bizExt := gjson.GetBytes(body, "content.data.bizExt").String()
// bizExt为base64 gb18030 编码的json字符串 需要解码
decodedBytes, err := base64.StdEncoding.DecodeString(bizExt)
if err != nil {
return "", err
}
reader := transform.NewReader(bytes.NewReader(decodedBytes), simplifiedchinese.GB18030.NewDecoder())
bizExtJson, err := io.ReadAll(reader)
if err != nil {
return "", err
}
bizExt = string(bizExtJson)
refreshToken = gjson.Get(bizExt, "pds_login_result.refreshToken").String()
ali.User.RefreshToken = refreshToken
return refreshToken, nil
default:
err = ErrQrCodeUnKnown
}
return
}
使用RefreshToken获取AccessToken
func (ali *AliClient) RefreshTokenFunc() error {
inter := API_HOST + V2_ACCOUNT_TOKEN
res, err := ali.post(Request{
Url: inter,
Json: map[string]interface{}{
"refresh_token": ali.User.RefreshToken,
"grant_type": "refresh_token",
},
})
if err != nil {
return err
}
body, err := io.ReadAll(res.Body)
if err != nil {
return err
}
err = json.Unmarshal(body, &ali.User)
if err != nil {
return err
}
if ali.User.AccessToken != "" {
if ali.Headers == nil {
ali.Headers = make(map[string]string)
}
ali.Headers["Authorization"] = ali.User.AccessToken
return nil
} else {
return ErrRefreshToken
}
}