Конечная точка Google oauth2 не возвращает информацию о профиле пользователя (имя и т. Д.) - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь использовать google oauth2 в своем веб-сервисе (golang), но не могу получить информацию о профиле пользователя (имя, фамилия).

Я пробую различные конечные точки, нокаждый раз получайте такой ответ:

{
    "id":"*************",
    "email":"***@gmail.com",
    "verified_email":true,
    "picture":"https://***/photo.jpg"
}

В то же время игровая площадка Google с таким набором областей возвращает ответ такого типа:

{
  "family_name": "***", 
  "name": "****", 
  "picture": "https://*******/photo.jpg", 
  "locale": "ru", 
  "email": "****@gmail.com", 
  "given_name": "*****", 
  "id": "************", 
  "verified_email": true
}

Как я могу получить тот же ответв моем веб-приложении?Люди на этом сайте и в Интернете советуют добавить область профиля, но я уже сделал это.

Вот мой код (сокращенный)

"golang.org/x/oauth2"
"golang.org/x/oauth2/google"

func init() {
    googleOauthConfig = &oauth2.Config{
        RedirectURL:  "*******",
        ClientID:     "*********",
        ClientSecret: "******",
        Scopes: []string{
            "https://www.googleapis.com/auth/userinfo.email",
            "https://www.googleapis.com/auth/userinfo.profile",
            "openid"},
        Endpoint: google.Endpoint,
    }
}

var googleOauthConfig *oauth2.Config

//const oauthGoogleURLAPI = "https://www.googleapis.com/oauth2/v1/userinfo"
const oauthGoogleURLAPI = "https://www.googleapis.com/oauth2/v2/userinfo"
//const oauthGoogleURLAPI = "https://www.googleapis.com/oauth2/v3/userinfo"
const oauthGoogleURLAPI2 = "https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses"
//const oauthGoogleURLAPI = "https://openidconnect.googleapis.com/v1/userinfo"

func HandleGoogleCallback(w http.ResponseWriter, r *http.Request) {
    ...

    oauthState, _ := r.Cookie(oauthstateCookieName)

    code := r.FormValue("code") 

    gtoken, err := googleOauthConfig.Exchange(oauth2.NoContext, code)

    bearer := "Bearer " + gtoken.AccessToken

    req, err := http.NewRequest("GET", oauthGoogleURLAPI, nil)
    req.Header.Add("Authorization", bearer)

    gresponse, err := http.DefaultClient.Do(req)

    contents, err := ioutil.ReadAll(gresponse.Body)

    authContent := &AuthContent{}

    err = json.Unmarshal(contents, authContent)

    log.Println(authContent)

    ...
}

Я также читал этостатья Google Oauth2 userinfo API не возвращает данные об имени пользователя Но результат тот же: информация профиля отсутствует.

Спасибо.

Обновление: по рекомендации комментарияЯ немного исправил код "golang.org/x/oauth2" и получил id_token.Когда я проверил этот токен идентификатора на jwt.io, я увидел все данные, которые мне нужны.Но я думал, что информация профиля должна быть получена через запрос API, подобный этому

req, err := http.NewRequest("GET", <endPoint>, nil)
gresponse, err := http.DefaultClient.Do(req)

В этом примере используется только стандартная библиотека go, а gresponse содержит полный http-ответ, не так ли?Почему ответ не содержит поля, которые мне нужны?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Я нашел ответ. Это была моя вина. Структура, получающая результат, выглядела так:

type AuthContent struct {
    ID            string `json:"id"`
    Email         string `json:"email"`
    VerifiedEmail bool   `json:"verified_email"`
    Picture       string `json:"picture"`
}

Вот почему в ответе нет таких полей, как имя.

0 голосов
/ 11 июня 2019
  1. Ошибка обработки в googleOauthConfig.Exchange(oauth2.NoContext, code)
  2. Ошибка обработки в http.DefaultClient.Do
  3. Ошибка обработки в ioutil.ReadAll(gresponse.Body)
  4. Ошибка обработки в json.Unmarshal

И вы можете найти ответ.

Также я помню, что я всегда отправлял access_token в качестве параметра запроса:

response, err := http.Get("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + token.AccessToken)
...