Oauth 2.0 谷歌+;OAuth API在首次登录和授权后存储和检索令牌

Oauth 2.0 谷歌+;OAuth API在首次登录和授权后存储和检索令牌,oauth-2.0,google-plus,Oauth 2.0,Google Plus,我已经阅读了有关如何使用Google API的文档、示例和教程,我已经有一个小应用程序在运行,它显示了您的最新活动和信息,但我使用会话来存储令牌 我的问题是,我如何从数据库中存储和检索令牌,以便当用户(已注册)单击“登录”时,它可以立即使用API而无需重复授权?请注意,我将该示例用作我的迷你应用程序的起点 下面是一段代码片段: $client = new apiClient(); $client->setApplicationName(APP_NAME); $client->setC

我已经阅读了有关如何使用Google API的文档、示例和教程,我已经有一个小应用程序在运行,它显示了您的最新活动和信息,但我使用会话来存储令牌

我的问题是,我如何从数据库中存储和检索令牌,以便当用户(已注册)单击“登录”时,它可以立即使用API而无需重复授权?请注意,我将该示例用作我的迷你应用程序的起点

下面是一段代码片段:

$client = new apiClient();
$client->setApplicationName(APP_NAME);
$client->setClientId(CLIENT_ID);
$client->setClientSecret(CLIENT_SECRET);
$client->setRedirectUri(REDIRECT_URL);
$client->setDeveloperKey(DEV_KEY);

$plus = new apiPlusService($client);
$google_userinfo = new apiOauth2Service($client);

$message = "";

// In a real application this would be stored in a database, and not in the session!
if (isset($_SESSION['token']))
  $client->setAccessToken($_SESSION['token']);

$_SESSION['token'] = $client->getAccessToken();

if (isset($_GET['code'])) {
   $client->authenticate();
  // In a real application this would be stored in a database, and not in the session!
  $_SESSION['token'] = $client->getAccessToken();
  header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
}
...
 //Somewhere here, I added a function that ties $_SESSION['token'] to the user's info.
...
<form action="" method="post" id="form1" name="form1">
   <fieldset>
      <div id="main-url-section" style="width: 50%;margin: 0px auto;text-align: center;">
         <?php
            $authUrl = $client->createAuthUrl();
            print "<p><a class='login' href='$authUrl'>Log me in!</a></p>";
         ?>                                 
      </div>
    </fieldset>
</form>
$client=new apiClient();
$client->setApplicationName(应用程序名称);
$client->setClientId(客户端ID);
$client->setClientSecret(client\u SECRET);
$client->setRedirectUri(重定向URL);
$client->setDeveloperKey(开发密钥);
$plus=新的apiPlusService($client);
$google_userinfo=新的APIOuth2服务($client);
$message=“”;
//在实际应用程序中,这将存储在数据库中,而不是会话中!
如果(isset($\u会话['token']))
$client->setAccessToken($_会话['token']);
$\会话['token']=$client->getAccessToken();
如果(isset($_GET['code'])){
$client->authenticate();
//在实际应用程序中,这将存储在数据库中,而不是会话中!
$\会话['token']=$client->getAccessToken();
标题('Location:http://'.$\u SERVER['http\u HOST'].$\u SERVER['PHP\u SELF']);
}
...
//在这里的某个地方,我添加了一个函数,将$\u会话['token']与用户信息联系起来。
...
非常感谢你的帮助

问候,


John

如果您希望Google跳过已授权您的应用程序的用户的授权提示,请在顶部的配置块中添加以下代码:

$client->setAccessType("online");
$client-> setApprovalPrompt("auto");
这个解决方案有一个缺点:当您完成OAuth舞蹈时,您将不会收到刷新令牌。这意味着您的用户每次访问令牌过期时都会被重定向到Google的身份验证服务,以便获取新的令牌。这几乎每小时都会发生

背景信息

默认情况下,PHP客户端库配置为提供。你可以在地图上看到这一点。启用此模式时,OAuth流将生成一个可用于根据需要请求新访问令牌的。你甚至可能没有注意到这种情况。PHP客户端库为您处理了大部分这方面的工作


不过,这个刷新令牌是有代价的。您负责存储它。如果您丢失了它,您的用户必须重新授权您的应用程序,您才能获得另一个应用程序。存储它的方式在很大程度上取决于实现的细节。会话数据是一种合理的方法,如果您能使其足够持久。

这是一个老问题,但在我看来,答案并不完整

接受的答案的工作方式是,用户确实要通过GoogleAuth服务器,只是看不到Auth屏幕。问题是存储令牌并再次使用,而不将用户发送到Google服务器

因此,如果这是您想要做的(并且它还允许您访问用户数据,即使他们当前未使用您的应用程序),那么您需要做的就是请求一个包含刷新令牌的访问令牌

您可以通过使用离线访问类型(顺便说一下,它不再是默认类型)来实现这一点,例如在php中:
$client->setAccessType(“离线”)

请记住,您收到的访问令牌将仅在用户的第一次初始授权中包含刷新令牌,因此这就是您需要存储的内容

然后,您就可以对客户端使用该访问令牌,即使它已过期,客户端也会负责刷新它并获取一个新令牌

希望有帮助,
阿莫斯

谢谢你的回答!这很有用,我可以将其用作临时修复。:)我已经签出了。但是你知道或者有关于如何存储我在$client->getAccessToken()中获得的令牌的帖子的链接吗?当用户登录时使用它们?@user1239714:我不知道在这里有什么地方可以链接到您的建议。这完全取决于如何在应用程序中持久化其余数据。例如,如果您正在编写一个典型的LAMP应用程序,将刷新令牌存储在MySql中以便以后调用可能是有意义的。@JennyMurphy“您可以在源代码中看到这一点”。链接断了。你能再提供一个样本吗?谢谢《骑士骑士》的推荐。我已经修好了链接。