Login 我如何使用谷歌&x27;s OpenID和/或OAuth服务登录并允许用户只需一次提示即可访问API?

Login 我如何使用谷歌&x27;s OpenID和/或OAuth服务登录并允许用户只需一次提示即可访问API?,login,oauth,openid,token,Login,Oauth,Openid,Token,我正在尝试为我的网站创建一个登录系统,该系统允许通过谷歌API进行身份验证,并允许访问任何OAuth支持的谷歌数据API,同时理想情况下,无论用户是创建帐户还是登录现有帐户,都只向用户显示一个提示。我想尽量减少他请求批准的次数 我知道Google为此提供了混合OpenID/OAuth,但问题是每次我向OpenID请求添加OAuth扩展时,它都不记得用户对该请求的批准。当我在做混合OpenID/OAuth时,有没有办法记住批准?如果我只是在没有OAuth扩展的情况下使用OpenID,那么一切都会被

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

我知道Google为此提供了混合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/';
混合OpenID/OAuth这样做正常吗(不记得上次OAuth授权)?最好的办法是什么?我曾想过在用户的计算机上存储cookie,以链接到我数据库中的某个地方,这样我就可以再次使用最后一个访问令牌,等等。。。(这里的问题是我不知道要查找谁的令牌,除非我知道用户是谁……这是一个循环问题)。执行一个只有OpenID的请求来获取他的用户ID,以查看他是否有帐户来查找他的访问令牌,然后执行一个OpenID+OAuth请求(如果没有存储他的访问令牌)将导致两个提示,这真的没有帮助

混合版似乎只支持OAuth 1.0,我认为它在2015年之前还可以,所以现在对我来说不是问题。我假设他们将来会支持OAuth2.0


checkid\u immediate与此相关吗?我只是不知道如何使用它来实现我想要的。

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

请看这里:

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


也就是说,您尝试使用OpenID2.0/OAuth1混合版所做的工作应该是可行的——用户应该看到一个“记住”授权的复选框。如果您真的想进一步调试,最好有一个网页,您可以指向它启动此身份验证+授权流程,这样我们就可以看到发生了什么。

我发现checkid\u立即(和x-has-session,不确定是否需要或是否工作)允许我在没有提示的情况下确定用户是否已登录,如果已登录,则会给我一个声明的id,通过该id我可以识别该用户。这正是我需要的。原来的问题已经解决了,但我确实想弄清楚如何在OAuth 2.0中使用Identity,因为我已经实现了它

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


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

如果有人想知道,以下是使混合OpenID/OAuth完全工作所需的步骤(概述)。在整个过程中,我被彻底弄糊涂了,所以我希望这能帮助一些人

  • 为OAuth 1.0执行普通OpenID握手和附加AX扩展。
    • 使用“checkid_immediate”允许在不提示用户的情况下探测活动的Google会话。使用*claimed_id*作为唯一标识符将用户链接到您的数据库
    • 如果返回“需要设置”,请使用“检查ID\u设置”,以便在继续之前提示并验证用户
    • 这就给你留下了两种可能性*checkid\u immediate*立即返回,给您一个声明的\u id,或者在*checkid\u安装*(基本上是注册)成功后通过声明的\u id
  • 混合OpenID/OAuth 1.0将为您提供授权请求令牌
  • 使用授权请求令牌获取访问令牌(您只需要调用OAuthGetAccessToken)
  • 使用OAuth 1.0访问令牌执行任何您想要的操作

我成功地使用OAuthGetAccessToken从授权请求令牌my Hybrid OAuth dance获取访问令牌,省略了“OAuth_verifier”参数(与Hybrid无关)


在混合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;

非常感谢。在OAuth 2.0中,我还没有发现如何识别用户是否与Google有活动会话,如果他有,他的活动会话id(一个“声明的id”或唯一的Google id)是什么,而没有向他显示任何内容。这是必要的,因为我需要查看他登录时是否在我们这里有活动帐户,如果有,确保他每次登录时不会在我们的数据库中“重新创建”他的帐户。我仍然想在我的数据库服务器上本地存储与他的帐户相关的数据。(字符限制..我将不得不评论两次。)我已经看到了该页面,并实现了OAuth 2.0的一些方面(我想只是API a)