如何处理“刷新令牌不可用”?

时间:2015-07-13 02:41:05

标签: php google-calendar-api

我知道此问题之前曾被问过几次,但他们的答案都是错误的,或者对我的工作流程不起作用。

在我的应用中,用户可以转到他们的设置页面并授权我的应用管理他们的日历。然后Google API为我提供了一个“访问令牌”,我将其保存在我的数据库中,其中包含其余的用户信息。

现在,用户可以在我的应用中创建活动。当他们创建活动时,我想将副本保存到Google日历。为此,我使用我编写的这个方便的方法来获得Google_Client

public static function getClient(User $user=null) {
    if(!$user) $user = Auth::user();

    $api = new Google_Client();
    $api->setApplicationName("MyWebApp");
    $api->setScopes([Google_Service_Calendar::CALENDAR]);
    $api->setClientId(Config::get('gapi.web.client_id'));
    $api->setClientSecret(Config::get('gapi.web.client_secret'));
    $api->setRedirectUri(URL::route('gapi.oauth2callback'));
    $api->setAccessType('offline');

    if(strlen($user->gapi_access_token)) {
        $api->setAccessToken($user->gapi_access_token);

        if($api->isAccessTokenExpired()) {
            $refreshToken = $api->getRefreshToken();
            if(strlen($refreshToken)) {
                $api->refreshToken($refreshToken);
                $user->gapi_access_token = $api->getAccessToken();
                $user->save();
            } else {
                // what should we do now?
            }
        }
    }

    return $api;
}

问题在于,即使用户拥有访问令牌,它也可能已过期且无法恢复。我得到的具体错误信息是:

  

OAuth 2.0访问令牌已过期,并且刷新令牌不可用。对于自动批准的响应,不会返回刷新令牌。

此方案很容易通过另一次调用googleClient->isAccessTokenExpired()来检测,然后我可以将用户转发到$googleClient->createAuthUrl(),这只是自动身份验证,因为他们'已经授权我的应用程序 - 问题是我无法设置动态返回URL!

我想在用户重新进行身份验证后立即完成创建事件的操作,但我不允许在重定向URI中传递任何GET参数,因此我不知道用户尝试做什么在他们离开我的网站之前。

我该如何处理?为什么我必须在用户允许的情况下让用户远离我的网站?

1 个答案:

答案 0 :(得分:1)

确保在对用户进行身份验证时使用access_type = offline(让他通过OAuth2循环)。同时检查您的Google Developer Console,确保在控制台上创建凭据时选择了“Web应用程序”。检查用户完成OAuth周期时收到的access_token,无论是否包含refresh_token。