Я пытаюсь использовать 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-ответ, не так ли?Почему ответ не содержит поля, которые мне нужны?