使用Google访问令牌如何获取用户资料

30

我正在测试通过谷歌访问令牌获取用户信息。

http://www.mawk3y.net/glogin

点击登录按钮后,我将被重定向到以下网址:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=access_token_here

并会得到类似下面的一些JSON数据:

{
"issued_to": "my client id.apps.googleusercontent.com",
"audience": "my client id.apps.googleusercontent.com",
"user_id": "user id here",
"scope": "https://www.googleapis.com/auth/plus.login",
"expires_in": 3596,
"access_type": "online"
}

现在我需要知道如何提取用户名、地址和电子邮件,请帮忙?

先行致谢。


1
https://www.googleapis.com/oauth2/v3/userinfo?access_token={access_token} - mohammad
10个回答

27

我遇到了同样的问题。我想提取用户信息,但找不到要访问的确切链接。然后我查看了Passport Google策略的代码,位于第54行

我的作用域是['profile', 'email']

GET请求

https://www.googleapis.com/oauth2/v3/userinfo?access_token={access_token}

响应

{
  "sub": "23423....",
  "name": "John Doe",
  "given_name": "John",
  "family_name": "Doe",
  "picture": "<Profile picture URL>",
  "email": "john.doe@gmail.com",
  "email_verified": true,
  "locale": "en"
}

@RajatAggarwal 我在谷歌文档中找不到这个URL,所以花了很长时间。最终 Passport JS 代码库对我有所帮助。 - Asutosh Panda
什么是sub?它像id一样吗? - reza_khalafi
@reza_khalafi 这个ID大概长这样:"112100881425580158538"。 - Farrokh Rostami Kia
有没有一个 URL 可以用 Secret code 验证 Access token? - CSharp-n

24

试试这个:

 var url = 'https://www.googleapis.com/plus/v1/people/me?access_token={access_token}';

  $.ajax({
    type: 'GET',
    url: url,
    async: false,
    success: function(userInfo) {
      //info about user
      console.log(userInfo);
      console.log('test');
    },
    error: function(e) {
      console.log('error');

    }
  });

谢谢,那个起作用了。 - Jigar
1
为什么谷歌文档没有显示access_token应该在查询字符串中呢?https://developers.google.com/+/web/api/rest/latest/people/get - dman
是的,这让我也有点迷失了。他们一定在其他 REST API 的概述中提到过,但我在 Google Plus 部分找不到。不过我找到了这个链接:https://developers.google.com/identity/protocols/OAuth2WebServer#callinganapi,它提到你可以将其放在 URL 中或者授权头中。但它们并不是真正相关的文章。 - Jon F.
1
为什么访问令牌在获取URL参数中?这难道不会带来中间跳转和安全风险吗? - Sanjeev Kumar Dangi
过时的版本,V3已经发布。 - mohammad

19
你可以使用这个API在服务器上验证通过Google登录后收到的授权令牌。
请求
https://www.googleapis.com/oauth2/v3/tokeninfo?id_token={accces_token}

响应

{

  "email_verified": "true",
  "email": "abhinav.xxx@gmail.com",
  "name": "abhinav srivastava",
  "picture": "https://lh3.googleusercontent.com/-xgD_zFj1EgY/AAAAAAAAAAI/AAAAAAAACZ0/fnecSQ03o0Y/s96-c/photo.jpg",
  "given_name": "abhinav",
  "family_name": "srivastava",
  "locale": "en",
  ...
  ...
}

来源


10
以上请求是为了id_token,而不是access_token。 - Armand
而不是使用这些URL,您可以使用以下URL,该URL在响应中还提供名称:https://www.googleapis.com/oauth2/v3/userinfo?id_token={access_token} - Dulal Sandip
有时候你没有 ID 令牌,只有访问令牌。 - IMPixel
有时候你没有身份令牌,只有访问令牌。 - undefined

9
如果您想要令牌信息,将 tokeninfo 作为参数传递。
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=ya29.a0AfH6SMArZZITzn-...

如果您想获取所有用户信息,请将userinfo作为参数传递。
https://www.googleapis.com/oauth2/v3/userinfo?access_token=ya29.a0AfH6SMArZZITzn-...

令牌信息响应

{
    "azp": "",
    "aud": "",
    "sub": "",
    "scope": "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile openid",
    "exp": "",
    "expires_in": "",
    "email": "",
    "email_verified": "",
    "access_type": ""
}

用户信息响应

{
    "sub": "",
    "name": "",
    "given_name": "",
    "family_name": "",
    "picture": "",
    "email": "",
    "email_verified": ,
    "locale": ""
}

不要忘记传递https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profile作为范围。

var params = {
  'client_id': '',
  'redirect_uri': '',
  'response_type': 'token',
  'scope': 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile',
};

4
您需要使用访问令牌(您可以在重定向URL中获取)来访问Google的People API。请查看此处的规格说明。
您可能会发现Google的OAuth2 playground非常有用,以了解如何使用访问令牌来访问Google的API。
祝好运!

1
我在向以下URL发送HTTP GET请求时遇到了错误: { "error": { "errors": [ { "domain": "usageLimits", "reason": "dailyLimitExceededUnreg", "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", "extendedHelp": "https://code.google.com/apis/console" } ], "code": 403, "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." } } 我收到了如上所示的错误信息。我使用了以下代码: $response = file_get_contents("https://www.googleapis.com/plus/v1/people/me"); echo $response; - jq beginner
当我使用以下代码时: $response = file_get_contents("https://www.googleapis.com/plus/v1/people/MY USER ID HERE?fields=birthday%2CcurrentLocation%2CdisplayName%2Cemails%2Cgender%2Cname&key={MY API KEY HERE}"); echo $response; 我得到了以下错误: { "error": { "errors": [ { "domain": "usageLimits", "reason": "keyInvalid", "message": "Bad Request" } ], "code": 400, "message": "Bad Request" } } 我只是复制并粘贴了我的更新的API密钥,所以我确定它是激活的。 - jq beginner

2

查看这个。里面有演示的例子。

代码片段:

$accountObj = call_api($_SESSION['accessToken'],"https://www.googleapis.com/oauth2/v1/userinfo");

call_api 调用 API 并获取数据:

function call_api($accessToken,$url){
    $curl = curl_init($url);

    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    $curlheader[0] = "Authorization: Bearer " . $accessToken;
    curl_setopt($curl, CURLOPT_HTTPHEADER, $curlheader);

    $json_response = curl_exec($curl);
    curl_close($curl);

    $responseObj = json_decode($json_response);

    return $responseObj;       
}

从账户对象中可以访问名称:

$your_name =  $accountObj->name;

1
你可以使用快速启动并在这里查看示例:样本
这是People:get的描述。

1

1
这是一个简单的Node.js服务器端代码。
 var express = require('express');
 var appln = express();
 var google = require('googleapis');
 var plus = google.plus('v1');
 var OAuth = google.auth.OAuth2;
 var oauth2client = new OAuth(YOUR_CLIENT_ID  , YOUR_SECRET_ID ,  CALLBACK_REDIRECT_URI );

 appln.get("/tokens" , function(req , res ) {
         var code = req.query.code;
       oauth2client.getToken( code , function( err , tokens ){
                         if(err){
                            console.log(err);
                            res.send(err);
                            return;
                            }
                 oauth2client.setCredentials(tokens);
                 actoken = tokens.access_token;
                 reftoken = tokens.refresh_token;

       plus.people.get({  
                  userId: 'me',
                  auth: oauth2client
                  }, function (err, response) {
               // handle err and response
               var name = ""+response.displayName;
               var id =  ""+response.id;
               var age = ""+response.ageRange.min;
               if(err) console.log(err);
               console.log("Name : ", name," ",id,"",age);    
               res.send(response);

           });




        });
  });                       

0

如果您正在使用PHP

您可以在这里进行检查。简而言之,您要查找的代码是:

$payload = $client->verifyIdToken($id_token);

这里的有效负载包含了你需要的信息,只要添加所需的范围即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接