我知道此问题之前曾被问过几次,但他们的答案都是错误的,或者对我的工作流程不起作用。
在我的应用中,用户可以转到他们的设置页面并授权我的应用管理他们的日历。然后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参数,因此我不知道用户尝试做什么在他们离开我的网站之前。
我该如何处理?为什么我必须在用户允许的情况下让用户远离我的网站?
答案 0 :(得分:1)
确保在对用户进行身份验证时使用access_type = offline(让他通过OAuth2循环)。同时检查您的Google Developer Console,确保在控制台上创建凭据时选择了“Web应用程序”。检查用户完成OAuth周期时收到的access_token,无论是否包含refresh_token。