Fix QqIdProvider.

This commit is contained in:
Yang Luo
2021-03-23 23:48:18 +08:00
parent c24de7d180
commit 39d208ccd0
2 changed files with 54 additions and 31 deletions

View File

@ -74,7 +74,7 @@ func (idp *GoogleIdProvider) GetToken(code string) (*oauth2.Token, error) {
func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) { func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
userInfo := &UserInfo{} userInfo := &UserInfo{}
type userInfoFromGoogle struct { type response struct {
Picture string `json:"picture"` Picture string `json:"picture"`
Email string `json:"email"` Email string `json:"email"`
} }
@ -82,17 +82,16 @@ func (idp *GoogleIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error)
resp, err := idp.Client.Get("https://www.googleapis.com/oauth2/v2/userinfo?alt=json&access_token=" + token.AccessToken) resp, err := idp.Client.Get("https://www.googleapis.com/oauth2/v2/userinfo?alt=json&access_token=" + token.AccessToken)
defer resp.Body.Close() defer resp.Body.Close()
contents, err := ioutil.ReadAll(resp.Body) contents, err := ioutil.ReadAll(resp.Body)
var tempUser userInfoFromGoogle var userResponse response
err = json.Unmarshal(contents, &tempUser) err = json.Unmarshal(contents, &userResponse)
if err != nil { if err != nil {
panic(err) return nil, err
} }
userInfo.Email = tempUser.Email if userResponse.Email == "" {
userInfo.AvatarUrl = tempUser.Picture return userInfo, errors.New("google email is empty")
if userInfo.Email == "" {
return userInfo, errors.New("google email is empty, please try again")
} }
userInfo.Email = userResponse.Email
userInfo.AvatarUrl = userResponse.Picture
return userInfo, nil return userInfo, nil
} }

View File

@ -15,12 +15,12 @@
package idp package idp
import ( import (
"context"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/url"
"regexp" "regexp"
"golang.org/x/oauth2" "golang.org/x/oauth2"
@ -68,51 +68,75 @@ func (idp *QqIdProvider) getConfig() *oauth2.Config {
} }
func (idp *QqIdProvider) GetToken(code string) (*oauth2.Token, error) { func (idp *QqIdProvider) GetToken(code string) (*oauth2.Token, error) {
ctx := context.WithValue(oauth2.NoContext, oauth2.HTTPClient, idp.Client) params := url.Values{}
return idp.Config.Exchange(ctx, code) params.Add("grant_type", "authorization_code")
params.Add("client_id", idp.ClientId)
params.Add("client_secret", idp.ClientSecret)
params.Add("code", code)
params.Add("redirect_uri", idp.RedirectUrl)
getAccessTokenUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/token?%s", params.Encode())
tokenResponse, err := idp.Client.Get(getAccessTokenUrl)
if err != nil {
return nil, err
}
defer tokenResponse.Body.Close()
tokenContent, err := ioutil.ReadAll(tokenResponse.Body)
tokenReg := regexp.MustCompile("token=(.*?)&")
tokenRegRes := tokenReg.FindAllStringSubmatch(string(tokenContent), -1)
tokenStr := tokenRegRes[0][1]
token := &oauth2.Token{
AccessToken: tokenStr,
TokenType: "Bearer",
}
return token, nil
} }
func (idp *QqIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) { func (idp *QqIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) {
userInfo := &UserInfo{} userInfo := &UserInfo{}
type userInfoFromQq struct { getOpenIdUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/me?access_token=%s", token.AccessToken)
Ret int `json:"ret"`
Nickname string `json:"nickname"`
AvatarUrl string `json:"figureurl_qq_1"`
}
getOpenIdUrl := fmt.Sprintf("https://graph.qq.com/oauth2.0/me?access_token=%s", token)
openIdResponse, err := idp.Client.Get(getOpenIdUrl) openIdResponse, err := idp.Client.Get(getOpenIdUrl)
if err != nil { if err != nil {
panic(err) return nil, err
} }
defer openIdResponse.Body.Close() defer openIdResponse.Body.Close()
openIdContent, err := ioutil.ReadAll(openIdResponse.Body) openIdContent, err := ioutil.ReadAll(openIdResponse.Body)
openIdReg := regexp.MustCompile("\"openid\":\"(.*?)\"}") openIdReg := regexp.MustCompile("\"openid\":\"(.*?)\"}")
openIdRegRes := openIdReg.FindAllStringSubmatch(string(openIdContent), -1) openIdRegRes := openIdReg.FindAllStringSubmatch(string(openIdContent), -1)
openId := openIdRegRes[0][1] openId := openIdRegRes[0][1]
if openId == "" { if openId == "" {
return userInfo, errors.New("openId is empty") return nil, errors.New("openId is empty")
} }
getUserInfoUrl := fmt.Sprintf("https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s", token, idp.ClientId, openId) getUserInfoUrl := fmt.Sprintf("https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s", token, idp.ClientId, openId)
getUserInfoResponse, err := idp.Client.Get(getUserInfoUrl) getUserInfoResponse, err := idp.Client.Get(getUserInfoUrl)
if err != nil { if err != nil {
panic(err) return nil, err
} }
type response struct {
Ret int `json:"ret"`
Nickname string `json:"nickname"`
AvatarUrl string `json:"figureurl_qq_1"`
}
defer getUserInfoResponse.Body.Close() defer getUserInfoResponse.Body.Close()
userInfoContent, err := ioutil.ReadAll(getUserInfoResponse.Body) userInfoContent, err := ioutil.ReadAll(getUserInfoResponse.Body)
var info userInfoFromQq var userResponse response
err = json.Unmarshal(userInfoContent, &info) err = json.Unmarshal(userInfoContent, &userInfo)
if err != nil || info.Ret != 0 { if err != nil {
return userInfo, err return nil, err
}
if userResponse.Ret != 0 {
return nil, errors.New(fmt.Sprintf("ret expected 0, got %d", userResponse.Ret))
} }
userInfo.Username = info.Nickname userInfo.Username = userResponse.Nickname
userInfo.AvatarUrl = userInfo.AvatarUrl userInfo.AvatarUrl = userResponse.AvatarUrl
return userInfo, nil return userInfo, nil
} }