Google :: Apis :: AuthorizationError (Unauthorized) при вызове get_userinfo_v2 - PullRequest
0 голосов
/ 06 апреля 2020

Я настраиваю симпатичный rails API, и мне нужно получить токен oauth2 от Google, а затем использовать его для получения базовой информации пользователя c (полное имя, адрес электронной почты и т. Д. c).

Токен создается мобильным приложением и отправляется в API.

Следующий код работает для получения электронной почты пользователя, но не для дополнительных полей

def google(auth)
    require 'google/apis/oauth2_v2'

    oauth2 = Google::Apis::Oauth2V2::Oauth2Service.new

    google_profile = oauth2.tokeninfo(id_token: auth)
end

I Я пытался получить информацию о пользователе, вызывая userinfo следующими способами:

google_profile = oauth2.get_userinfo
google_profile = oauth2.get_userinfo_v2

Но ни одна из них не работает, я получаю Google::Apis::AuthorizationError (Unauthorized)

Не могу найти способ найти чтобы настроить gem для правильной настройки ключей авторизации, я пробовал

oauth2.key='AIz...ryg'

Также пытался использовать аутентификацию json, например:

{
  "web": {
    "client_id":"xxx.apps.googleusercontent.com",
    "project_id":"...",
    "auth_uri":"https://accounts.google.com/o/oauth2/auth",
    "token_uri":"https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
    "client_secret":"aZ...sl"
  }
}

Но я всегда получаю одно и то же исключение. Вызов ex.body возвращает

{
  "error": {
    "code": 401,
    "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "errors": [
      {
        "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
        "domain": "global",
        "reason": "unauthorized"
      }
    ],
    "status": "UNAUTHENTICATED"
  }
}

1 Ответ

0 голосов
/ 06 апреля 2020

Работает ли это (c & p с незначительными изменениями от https://gist.github.com/skycocker/ba67e6756131fb43cf4963e024158be1):

require 'google/apis/oauth2_v2'

google = Google::Apis::Oauth2V2::Oauth2Service.new
signet = Signet::OAuth2::Client.new(
  authorization_uri:    'https://accounts.google.com/o/oauth2/auth',
  token_credential_uri: 'https://www.googleapis.com/oauth2/v3/token',
  client_id:            'YOUR_CLIENT_ID',
  client_secret:        '', # exists for apps registered as web application
  scope:                'email profile', # data you want to retrieve
  redirect_uri:         'http://localhost/callback', # it has to match the redirect_uri provided when obtaining signet.code below
)
signet.code = '4/R0...' # https://developers.google.com/identity/protocols/OAuth2WebServer#handlingresponse - modify the link from section "Sample OAuth 2.0 server response" according to your project, then use the code passed after a redirect
signet.fetch_access_token!

google.authorization = signet
google.get_userinfo_v2
# => #<Google::Apis::Oauth2V2::Userinfoplus:0x007f916603a350 @email="google@...", @family_name="...", ...>

...