如何使用Google访问令牌获取用户电子邮件?

18
我按照所有这些步骤进行了操作。

https://developers.google.com/+/web/signin/

我有客户端ID和客户端密钥。
现在我已经获得了访问令牌,如何使用访问令牌获取用户资料和电子邮件?以及如何检查用户是否已登录?

你如何获取访问令牌? - selvan
@konga raju,你是怎么获取令牌的?能否告诉我具体步骤,谢谢。 - Nagaraju Kasa
这个回答解决了你的问题吗?使用Google OAuth API获取用户的电子邮件地址? - Eugen Konkov
4个回答

30
使用OAuth2,您可以通过范围参数请求权限。(文档)。我想您需要的范围是https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/auth/userinfo.profile
然后,一旦获得访问令牌,获取个人资料信息就变得非常简单。(我假设您已经能够使用返回的授权代码兑换访问令牌?)只需向https://www.googleapis.com/oauth2/v1/userinfo?access_token={accessToken}发出get请求,它会返回一个包含电子邮件在内的个人资料数据的JSON数组:
{
    "id": "00000000000000",
    "email": "fred.example@gmail.com",
    "verified_email": true,
    "name": "Fred Example",
    "given_name": "Fred",
    "family_name": "Example",
    "picture": "https://lh5.googleusercontent.com/-2Sv-4bBMLLA/AAAAAAAAAAI/AAAAAAAAABo/bEG4kI2mG0I/photo.jpg",
    "gender": "male",
    "locale": "en-US"
}

不保证一定成功,但可以尝试以下方法:

$url = "https://www.googleapis.com/oauth2/v1/userinfo";
$request = apiClient::$io->makeRequest($client->sign(new apiHttpRequest($url, 'GET')));

if ((int)$request->getResponseHttpCode() == 200) {
    $response = $request->getResponseBody();
    $decodedResponse = json_decode($response, true);
    //process user info
  } else {
    $response = $request->getResponseBody();
    $decodedResponse = json_decode($response, true);
    if ($decodedResponse != $response && $decodedResponse != null && $decodedResponse['error']) {
      $response = $decodedResponse['error'];
    }
  }
}

1
如果您拥有访问令牌,那么这意味着您已经成功登录系统。 - Vineet1982
嘿,它完美地运行了。但是我在迁移博客中读到Google将于2014年9月停止提供userinfo.email和userinfo.profile服务。因此,在那之后这将无法工作。他们提供的替代方法是使用people.me端点。那该如何实际使用呢? - Kartik Domadiya
@kartik,我真的不知道迁移方面的事情,谢谢你的信息。我需要查阅文档并进行操作,很快会让你知道的。第一次尝试似乎是他们要关闭OAuth OpenID并转向G+。 - Vineet1982
@Vineet1982 现在我没有在响应中收到电子邮件。API 已经更新了吗? - I'm nidhin
@I'mnidhin,OAuth 1.0支持已被禁用,因此您需要将其更新为OAuth 2.0。 - Vineet1982
显示剩余4条评论

7

试试这个

$accessToken = 'access token';
$userDetails = file_get_contents('https://www.googleapis.com/oauth2/v1/userinfo?access_token=' . $accessToken);
$userData = json_decode($userDetails);

if (!empty($userData)) {

  $googleUserId = '';
  $googleEmail = '';
  $googleVerified = '';
  $googleName = '';
  $googleUserName = '';

  if (isset($userData->id)) {
    $googleUserId = $userData->id;
  }
  if (isset($userData->email)) {
    $googleEmail = $userData->email;
    $googleEmailParts = explode("@", $googleEmail);
    $googleUserName = $googleEmailParts[0];
  }
  if (isset($userData->verified_email)) {
    $googleVerified = $userData->verified_email;
  }
  if (isset($userData->name)) {
    $googleName = $userData->name;
  }
} else {

  echo "Not logged In";
}

还有一个问题,我如何在页面加载时检查是否已登录。 - kongaraju
@KongaRaju,使用authResult['status']['signed_in']来检查是否已登录。 - I'm nidhin
@dino,我们如何获取这个令牌?你能分享一下你的意见吗?谢谢。 - Nagaraju Kasa

1

您只需将此行添加到您的scope中。 打开您的Application.cfc文件,然后添加以下代码。

     <cfset request.oauthSettings = 
           {scope = "https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile",
                                    client_id = "Your-id",
                                    client_secret = "your-secret",
                                    redirect_uri = "redirect-page",
                                    state = "optional"} />

现在你可以通过调用以下函数获取电子邮件
    <cfscript>              
        public function getProfile(accesstoken) {

            var h = new com.adobe.coldfusion.http();
            h.setURL("https://www.googleapis.com/oauth2/v1/userinfo");
            h.setMethod("get");
            h.addParam(type="header",name="Authorization",value="OAuth #accesstoken#");
            h.addParam(type="header",name="GData-Version",value="3");
            h.setResolveURL(true);
            var result = h.send().getPrefix();
            return deserializeJSON(result.filecontent.toString());
        }       
    </cfscript>

            <cfoutput>
            <cfset show = getProfile(session.ga_accessToken)>
            <cfdump var="#show#">
           </cfoutput>

希望这能帮助许多人解决问题。 :)

1
$access_token = 'your access token';
$headers = array('Content-Type: Application/json');
$endpoint = "https://www.googleapis.com/oauth2/v1/userinfo?access_token=".$access_token;


$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL, $endPoint);
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true);
curl_setopt($soap_do, CURLOPT_HTTPHEADER, $header);

curl_setopt($soap_do, CURLOPT_FAILONERROR, true);
$result = curl_exec($soap_do);

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