【问题标题】:How to get user email with google access token?如何使用谷歌访问令牌获取用户电子邮件?
【发布时间】:2013-02-12 19:44:46
【问题描述】:

我遵循了所有这些步骤。

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

我有客户端 ID 和客户端密码。

我现在获得了访问令牌,如何获取带有访问令牌的用户个人资料和电子邮件?以及如何查看用户是否登录?

【问题讨论】:

标签: php javascript jquery html


【解决方案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);

【讨论】:

    【解决方案2】:

    您只需将此行添加到您的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>
    

    希望这可以帮助很多人解决这个问题。 :)

    【讨论】:

      【解决方案3】:

      试试这个

      $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,使用 authResult['status']['signed_in'] 检查是否登录
      • @dino 我们如何获得这个令牌你能分享我你的 cmets 谢谢
      【解决方案4】:

      使用 OAuth2,您可以通过范围参数请求权限。 (Documentation.) 我想你想要的范围是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'];
          }
        }
      }
      

      【讨论】:

      • 如果你有访问令牌,那么这意味着你已经登录了
      • 我的意思是当我获得访问令牌时,当用户点击登录或使用登录按钮加载页面时,我可以获得访问令牌
      • 嘿,它的工作绝对完美。但我在Migration Blog 中读到,Google 将从 2014 年 9 月起停止对 userinfo.email 和 userinfo.profile 的服务。所以这之后就行不通了。他们提供的替代方案是使用 people.me 端点。实际如何使用?
      • @kartik 我真的不知道迁移感谢您的信息。我必须通过文档和做的事情会让你很快知道。在第一次尝试中,他们似乎正在关闭 oauth openid 并转向 g+。
      • @Vineet1982 现在我没有收到回复中的电子邮件。 api更新了吗?
      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 2021-12-23
      • 2017-05-22
      • 2013-07-20
      • 2017-11-13
      • 2021-03-20
      • 2017-05-07
      • 2017-04-23
      相关资源
      最近更新 更多