1

我正在尝试为我的网站创建一个登录系统,允许通过 Google 的 API 进行身份验证和访问任何支持 OAuth 的 Google 数据 API,同时理想情况下只向用户显示一个提示,无论他是创建帐户还是登录他现有的。我想尽量减少他被要求批准的次数。

我知道谷歌为此目的提供了混合 OpenID/OAuth,但问题是每次我向我的 OpenID 请求添加 OAuth 扩展时,它永远不会记住用户对该请求的批准。当我进行混合 OpenID/OAuth 时,有什么方法可以记住批准?如果我只是在没有 OAuth 扩展的情况下执行 OpenID,那么一切都会很好地记住,并且不会一直用提示来干扰用户。

除了我的 OpenID 请求之外,这是我发送的相关扩展,这导致我获得 OAuth 请求令牌(好)但导致批准永远不会被记住(坏)。

PHP 语法:

$args["openid.ns.ext2"] = 'http://specs.openid.net/extensions/oauth/1.0';
$args["openid.ext2.consumer"] = 'www.MYSITE.com';
$args["openid.ext2.scope"] = 'http://www-opensocial.googleusercontent.com/api/people/';
$args["openid.mode"] = 'checkid_setup';
$args["openid.realm"] = 'http://www.MYSITE.com/';

Hybrid OpenID/OAuth 以这种方式行事是否正常(不记得最后一次 OAuth 授权)?解决这个问题的最佳方法是什么?我曾想过在用户的计算机上存储 cookie 以链接到我的数据库中的某个位置,这样我就可以再次使用最后一个访问令牌,等等......(这里的问题是我不知道要查找谁的令牌,除非我知道谁用户是......一个循环问题)。并且执行仅 OpenID 请求以获取他的用户 ID 以查看他是否有帐户以查找他的访问令牌,然后执行 OpenID+OAuth 请求(如果未存储他的访问令牌)将导致两个提示,这真的无济于事。

看起来 Hybrid 似乎只支持 OAuth 1.0,我认为它在 2015 年之前都很好,所以现在对我来说这不是问题。我假设他们将来会支持 OAuth 2.0。

checkid_immediate是否与此相关?我只是不确定如何使用它来完成我想要的。

4

3 回答 3

3

我建议使用 OAuth 2.0。这支持获取身份和对 API 的访问——因此实现了相同的最终目标,但比 OAuth 1 Hybrid 容易得多。

看看这里: https ://developers.google.com/accounts/docs/OAuth2Login

您尝试访问的范围包含在 URL 中(请参阅“形成 URL”)。引用的文档列出了获取身份/配置文件信息所需的范围。您可以简单地向字符串添加额外的范围,以逗号分隔,以便请求访问其他 API。生成的访问令牌将访问 API 和身份信息(通过提到的 UserInfo API 端点)。

也就是说,您尝试对 OpenID 2.0/OAuth 1 混合执行的操作应该可以工作——并且用户应该会看到一个“记住”授权的复选框。如果您真的想进一步调试它,有一个可以指向的网页会很有帮助,该网页会启动此身份验证+授权流程,这样我们就可以看到发生了什么。

于 2012-05-14T23:44:27.097 回答
0

我发现checkid_immediate(和x-has-session,不确定是否需要甚至工作)允许我确定用户是否在不提示他的情况下登录,如果他是,它给了我一个claim_id通过它我可以识别用户。这正是我所需要的。原始问题已解决,我确实想弄清楚如何使用 OAuth 2.0 来识别,因为我已经实现了。

此外,我注意到在使用 OpenID/OAuth 时,即使在他授权 OpenID 之后,用户仍然会被要求授权 OAuth。从用户的角度来看,我看不到混合方法的优势。

如果用户从 Google 中注销,则总共需要三个提示来注册我的网站并获取他的姓名和个人资料图片。

于 2012-05-16T20:42:11.900 回答
0

如果有人想知道,这里是使 Hybrid OpenID/OAuth 完全工作所需的步骤(概述)。在整个过程中,我感到非常困惑,所以我希望这对某人有所帮助。

  • 进行正常的 OpenID 握手并为 OAuth 1.0 添加 AX 扩展。
    • 使用“checkid_immediate”允许在提示用户的情况下探测活动的 Google 会话。使用 *claimed_id* 作为唯一标识符将用户链接到您的数据库。
    • 如果返回“setup_needed”,请使用“checkid_setup”,以便在继续之前提示并验证用户。
    • 这给您留下了两种可能性。*checkid_immediate* 立即返回给你一个claim_id,或者在*checkid_setup*(基本上是注册)成功后通过的claim_id。
  • Hybrid OpenID/OAuth 1.0 会给你一个授权的请求令牌。
  • 使用授权的请求令牌获取访问令牌需要调用OAuthGetAccessToken)
  • 使用该 OAuth 1.0 访问令牌来做任何你想做的事情。

我成功地使用 OAuthGetAccessToken 从我的混合 OAuth 舞蹈的授权请求令牌中获取访问令牌,省略了“oauth_verifier”参数(与混合无关)。

在我的混合 OAuth 舞蹈之后,我成功地使用 OAuthGetAccessToken 获取访问令牌,省略了“oauth_verifier”参数(与混合无关)。

在 PHP/Zend 环境中:

$config = array(
    'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken',
    'consumerKey' => $consumer_key,
    'consumerSecret' => $consumer_secret
);
$consumer = new Zend_Oauth_Consumer($config);

$zendRToken = new Zend_Oauth_Token_Request(); // create class from request token we already have
$zendRToken->setToken($requestToken);

try{
    $accessToken = $consumer->getAccessToken(array(
          'oauth_token'               => $requestToken,
//          'oauth_verifier'            => '', // unneeded for Hybrid
          'oauth_timestamp'           => time(),
          'oauth_nonce'               => md5(microtime() . mt_rand()),
          'oauth_version'             => '1.0'
      ), $zendRToken);
} catch (Zend_Oauth_Exception $e){
    echo $e->getMessage() . PHP_EOL;
    exit;
}

echo "OAuth Token: {$accessToken->getToken()}" . PHP_EOL;
echo "OAuth Secret: {$accessToken->getTokenSecret()}" . PHP_EOL;
于 2012-05-16T23:22:18.577 回答