mirror of
https://github.com/casdoor/casdoor.git
synced 2025-07-08 09:01:00 +08:00
Fix QqIdProvider.
This commit is contained in:
@ -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
|
||||||
}
|
}
|
||||||
|
68
idp/qq.go
68
idp/qq.go
@ -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
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user