programing

사용자의 이메일 주소를 얻기위한 Google OAuth API?

copyandpastes 2021. 1. 17. 12:32
반응형

사용자의 이메일 주소를 얻기위한 Google OAuth API?


내 개인 Google 계정을 사용하여 Google의 OAuth 2.0 Playground를 사용하고 있지만 Playground를 사용하여 Gmail 주소를 복구 할 수없는 것 같습니다.

내가 사용하는 범위는 다음과 같습니다.

email profile https://www.googleapis.com/auth/plus.login

하지만 API를 호출하면 :

https://www.googleapis.com/oauth2/v2/userinfo

성, 이름, 성별, 사진 등 사용자에 대한 다양한 정보를 얻었지만 사용자의 이메일이 반환되지 않습니다.

사용자의 이메일 주소는 어떻게 검색합니까? 범위가 잘못되었거나 잘못된 API를 호출하고 있습니까? 나는 이것이 매우 간단해야한다고 생각하지만 문자 그대로 몇 시간 동안 이것을 알아 내려고 노력했고 사용자의 이메일 주소를 지속적으로 제공하는 API 및 범위 조합을 찾을 수 없습니다.


업데이트 : 2018 년 12 월

12 월 20 일에 Google은 2019 년 3 월에 Google+ API가 중단되고 2019 년 1 월 말부터 간헐적 인 오류가 발생한다고 발표했습니다 . plus.people.get엔드 포인트의 일부 는 더 이상 사용되지 않으며 종료 될 예정 입니다.

userinfo엔드 포인트는 사용되지 드 - (설명 참조) 가정 정보를 제공해야한다입니다

  1. https://developers.google.com/identity/sign-in/web/devconsole-project범위를 요청 하고
  2. email필드를 요청합니다 .

설명 : 2019 년 1 월 24 일

Google 은 userinfo (v2) 엔드 포인트가 더 이상 사용되지 않는다고 문서화 했지만 나중에 "사용되지 않지만 이전 버전과의 호환성을 위해 계속 사용 가능"으로 변경했습니다.

현재 문서 에서는 현재 지원되는 openid방법을 통해 프로필 및 이메일 정보를 얻는 방법에 대해 설명합니다 . 여기에는 OpenID Connect에서 요구하는대로 검색 문서에 지정된 "userinfo"엔드 포인트 사용이 포함됩니다 .

현재 해당 URL은 https://openidconnect.googleapis.com/v1/userinfo이지만 이는 과거에 변경되었으며의 검색 문서 https://accounts.google.com/.well-known/openid-configuration가 사용할 URL에 대한 신뢰할 수있는 소스입니다.

그래서 명확하게 :

  • 이전 사용자 정보 URL은 이전 버전과의 호환성을 위해 유지됩니다.
  • 새 사용자 정보 URL은 검색 문서에서 사용할 수 있습니다.

그럼에도 불구하고 모든 플러스 버전 (아래 설명)은 더 이상 사용되지 않으며 제거 될 예정 입니다.

원래 답변

당신이하고있는 일과 그것을하려는 방법에 많은 문제가 있습니다.

우선, https://www.googleapis.com/oauth2/v2/userinfo엔드 포인트는 더 이상 사용되지 않으며 2014 년 9 월에 제거 될 예정입니다. 일관되지 않게 작동하기 시작 했으므로 사용하지 마십시오.

@abraham이 언급했듯이에서 people.get 엔드 포인트를 사용합니다 https://www.googleapis.com/plus/v1/people/me. 그러면 주소 배열이 포함 된 이메일 필드 가 제공 됩니다. 귀하의 경우에는 "계정"유형을 가진 하나만있을 것입니다.


2017 년 기준 : email범위를 사용합니다 . API 요청 승인을 참조하십시오 .

이메일 범위는 https://www.googleapis.com/auth/userinfo.email 범위 와 동일하며이를 대체합니다 .

여기에 이미지 설명 입력


https://www.googleapis.com/auth/userinfo.email범위 를 추가 하거나 교체 https://www.googleapis.com/oauth2/v2/userinfo할 수 있습니다. 제공되는 HTML 예제를 사용하는 경우 공백으로 구분 된 여러 범위를 나열 할 수 있습니다.

<span
  class="g-signin"
  data-callback="signInCallback"
  data-clientid="{{ plus_id }}"
  data-cookiepolicy="single_host_origin"
  data-requestvisibleactions="http://schemas.google.com/AddActivity"
  data-scope="https://www.googleapis.com/auth/plus.login   
  https://www.googleapis.com/auth/userinfo.email">
</span>

내 서버가 / oauth2 / v2 / userinfo api 호출에 대한 응답으로 이메일을받지 못한 이유를 찾아 여기에 왔습니다. 내가 이것을 본 것은 단 한 번이었고 과거에는 잘 작동했습니다.

대답은 좋은 리드를주었습니다. 이 문제를 해결하는 동안 도움이 된 몇 가지 다른 리소스가 있습니다. 그래도 응답에서 항상 이메일을 기대하는 것이 괜찮은지 확실하지 않습니다. 그래서-이메일이 반환되지 않는 경우 코드에 오류 처리를 넣으십시오.

  1. Google+ 로그인으로 마이그레이션하는 방법에 대한 Google API 문서 입니다.
  2. https://www.googleapis.com/auth/userinfo.email 범위
  3. 인력 자원 문서
  4. Add google+ api to the project using google developer console. The complimentary (quota) of calls is quite high (20m for google+ signin api per day).
  5. Add error handling & logging in server code in case api returns no emails. In my case, I was looking only type='account' email.

This is actually a bit of a challenge as Google does not provide an email by default. You must specifically request it from Google Plus.

const scope = [
  'https://www.googleapis.com/auth/plus.me', // request access here
  'https://www.googleapis.com/auth/userinfo.email',
];

auth.generateAuthUrl({
  access_type: 'offline',
  prompt: 'consent',
  scope: scope,
});

const plus = google.plus({ version: 'v1', auth });
const me = await plus.people.get({ userId: 'me' });
const userEmail = me.data.emails[0].value;

There is a full version in this blog post I wrote: https://medium.com/@jackscott/how-to-use-google-auth-api-with-node-js-888304f7e3a0


For signing in with Google using OAuth 2.0, there's no need to make a separate request to get user's email.

When Google calls the callback URL, it provides a code in the query string that you could use to exchange for access token and ID token. The ID token is a JWT that contains identity information about the user, which includes the email address.

See more information here: https://developers.google.com/identity/protocols/OpenIDConnect


I have been following Prisoner's answer right above, and it helped me... until I received the email from Google Developers about how Google+ API will be shutdown on March 7, 2019.

I scrounged around and found this solution to get the email using an id_token that is returned when you authorize an app with the email scope on your developer console.

From Google Sign-in for Websites:

PHP에서 ID 토큰을 확인하려면 PHP 용 Google API 클라이언트 라이브러리를 사용하세요. 라이브러리를 설치합니다 (예 : Composer 사용).

composer require google/apiclient

그런 다음 verifyIdToken () 함수를 호출합니다. 예를 들면 :

require_once 'vendor/autoload.php';

// Get $id_token via HTTPS POST.

$client = new Google_Client(['client_id' => $CLIENT_ID]);  // Specify the CLIENT_ID of the app that accesses the backend
$payload = $client->verifyIdToken($id_token);
if ($payload) {
  $userid = $payload['sub'];
  // If request specified a G Suite domain:
  //$domain = $payload['hd'];
} else {
  // Invalid ID token
}

이렇게하면 로그인 한 사용자의 이메일도 포함 된 사용자 정보가 포함 된 배열이 반환됩니다. 이것이 다른 사람에게 도움이되기를 바랍니다.


https://developers.google.com/gmail/api/v1/reference/users/getProfile

Gmail API의 경우 nodejs 코드에 다음을 추가하십시오.

function getUsersEmail (auth) {
  const gmail = google.gmail({version: 'v1', auth})
  gmail.users.getProfile({
    userId: 'me'
  }, (err, {data}) => {
    if (err) return console.log('The API returned an error: ' + err)
    console.log(data.emailAddress)
  })
}

Gmail API : https://developers.google.com/gmail/api/guides/


authorizationRequest주어진 범위로 변경하고 scope=openid%20email%20profileuserinfoapi를 사용하십시오. 이 링크는 나를 위해 일했습니다.

참조 URL : https://stackoverflow.com/questions/24442668/google-oauth-api-to-get-users-email-address

반응형