【问题标题】:How to reauthenticate a user using Google Oauth2如何使用 Google Oauth2 重新认证用户
【发布时间】:2015-10-12 22:07:58
【问题描述】:

这是我的问题。我在带有自定义图像的页面上有一个 Google Plus 链接。网址是

https://accounts.google.com/o/oauth2/auth?client_id=' 。 Zend_Registry::get('config')->googlePlus->client_id 。 '&redirect_uri=' . urlencode($strRedirectUrl) 。 '&access_type=offline&response_type=code&scope=' 。 urlencode('https://www.googleapis.com/auth/plus.login') 。 '&' 。 urlencode('https://www.googleapis.com/auth/plus.me')

客户端 ID 和重定向是动态传入的。 (此链接由 PHP 函数生成。)

用户单击链接并通过 Google 进行身份验证。现在我需要将它们登录到我的应用程序中。似乎从服务器返回的唯一内容是身份验证代码。我不知何故需要一个Google_Client,我可以在上面获取用户信息。问题是当我构建客户端以满足 Google 的所有要求时,我遇到了一个问题,即我试图重用代码。我想我已经找到了解决办法。

不过,得到redirect_uri_mismatch。广泛的谷歌搜索说这是因为 URI 不在我的开发者控制台中。然而确实如此。我已经检查了四次,它完全一样。没有特殊的端口或尾部斜杠或任何东西。所以我不知道为什么会出现这个错误。

是不是因为我在上面的链接中传入了一个redirect_uri,然后在下面指定了一个?我确实注意到,如果我使两个redirect_uris 相同,redirect_uri 错误就会消失,但随后我会收到一个错误,表明代码已被兑换。我猜是因为它骑自行车回到了以前的位置。无论如何,我不能让两者相同,因为我需要不同的来通过我的代码路由浏览器。

(以下所有 Zend_Registry 值均已确认。此函数返回一个字符串,即必要的 API 密钥。)

$client = new Google_Client();
$client->setApplicationName('Web Application');
$client->setClientId(Zend_Registry::get('config')->googlePlus->client_id);
$client->setDeveloperKey(Zend_Registry::get('config')->googlePlus->serverKey);
$client->setClientSecret(Zend_Registry::get('config')->googlePlus->secret);
$client->setRedirectUri('http://test.XXX.com/login/social/network/google');
$client->setScopes(array('https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile'));
$client->setAccessType('offline');
$client->setApprovalPrompt('force'); # this line is important when you revoke permission from your app, it will prompt google approval dialogue box forcefully to user to grand offline access
$client->getRefreshToken();

$plus = new Google_Service_Oauth2($client);

if (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
}

if ($client->getAccessToken())
 {
     $userinfo = $plus->userinfo;
     die(print_r($userinfo->get()));

 }

我不喜欢这种结构方式,因为当用户在弹出窗口中填写其凭据时,我已经通过 Google 进行了身份验证。但我看不出有什么办法。我愿意接受任何和所有建议。这是我第一次使用这个 API,我不得不说文档真的很烂。

【问题讨论】:

  • 如果您查看错误页面上的“请求详细信息”下拉菜单,redirect_uri 值是否与配置了 redirect_uris 的应用程序之一完全匹配?一个字符一个字符,包括协议、端口、后面的斜线等。
  • 我没有收到包含请求详细信息的 Google 错误页面。到这个周期的那个时候,Zend 已经拦截了调用并抛出了 Google 异常作为它自己的异常——没有请求详细信息。
  • 但是代码中的内容正是,字符对字符,开发控制台中的内容,以回答您的问题。除非有什么东西被重写了,我不知道怎么看,因为那时 Zend 已经在里面了。
  • 有一个很大帮助的事情是确切地知道我需要用户单击哪个链接来弹出身份验证窗口。有人吗?

标签: php google-api google-plus google-oauth google-api-php-client


【解决方案1】:

范围需要用空格分隔。您已添加 . '&' 。

这意味着第二个作用域是一个无效键,因为 & 是一个特殊字符。

如果您不知道,您可能会发现 Oauthplayground 在尝试各种请求时非常有用。 https://developers.google.com/oauthplayground/

【讨论】:

  • 这还不是我的问题。我从来没有走到那一步,但很高兴知道和其他人的好信息,所以我接受了你的回答,即使它与我的问题没有直接关系。
  • 我们可以尝试帮助调试。如果这是我们可以看到页面(和链接)的地方?你还需要 plus.login 范围吗?您需要 Google+ 社交功能吗?如果没有,请使用 Google 登录以简化用户体验 developers.google.com/identity(请参阅 Google 登录网页)
猜你喜欢
  • 2020-07-15
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2012-01-08
  • 2020-10-29
  • 1970-01-01
相关资源
最近更新 更多