首次登录和授权后,Google+ OAuth API会存储和检索令牌

时间:2012-04-11 07:19:25

标签: oauth-2.0 google-plus

我已阅读有关如何使用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>

非常感谢您的帮助!

此致

约翰

2 个答案:

答案 0 :(得分:9)

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

$client->setAccessType("online");
$client-> setApprovalPrompt("auto");

此解决方案有一个问题:当您完成OAuth舞蹈时,您将不会收到刷新令牌。这意味着,每次访问令牌过期时,您的用户都会被重定向到Google的身份验证服务,以便获取新用户。这大概每小时都会发生一次。

背景资讯

默认情况下,PHP客户端库配置为提供offline access。您可以在source code中看到这一点。启用此模式后,OAuth流将生成refresh token,可用于根据需要请求新的访问令牌。你可能甚至没有注意到这种情况。 PHP客户端库会为您处理大部分内容。

此刷新令牌需要付出代价。您负责存储它。如果您丢失了它,您的用户必须重新授权您的应用程序,以便您再次发布。您存储它的方式很大程度上取决于您的实现细节。如果可以使会话数据足够持久,那么会话数据是一种合理的方法。

答案 1 :(得分:1)

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

接受的答案适用于用户通过Google Auth服务器的方式,只是没有看到Auth屏幕。问题是存储令牌并再次使用它而不将用户发送到Google服务器。

因此,如果你想做什么(即使他们当前没有使用你的应用程序,它也允许你访问用户数据),你需要做的就是要求一个包含访问权限的访问令牌刷新令牌。

您可以使用离线访问类型(顺便说一下,这不是默认设置) - 例如在php:$client->setAccessType("offline");中。

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

然后您可以将该访问令牌与客户端一起使用,即使它已过期,客户端也会负责刷新它并获得一个新的。

希望有所帮助, 摩