Oauth 2.0 OAuth 2.0访问令牌已过期,刷新令牌不可用
我有一个基于web的应用程序,它使用GoogleOAuth2.0作为登录框架。直到昨天,它一直工作得很好。访问令牌过期后,应用程序无法获取刷新令牌。除此之外,“权限请求”页面已改为“离线访问”,而不是“知道你在谷歌上是谁”和“查看你的电子邮件” 最初,“请求许可”页面将请求访问“知道你在谷歌上是谁”和“查看你的电子邮件”。用户注销并尝试第二次登录后,“权限请求”页面也将相同 然而,直到昨天,“许可请求”页面才改为“离线访问”。访问令牌过期后,我收到以下错误消息: PHP致命错误:未捕获异常“Google_AuthException”,消息为“OAuth 2.0访问令牌已过期,刷新令牌不可用”。对于自动批准的响应,不会返回刷新令牌。'in/home2/xxxx/public_html/test/google api php client/src/auth/google_OAuth2.php:221 我尝试了Oauth 2.0 OAuth 2.0访问令牌已过期,刷新令牌不可用,oauth-2.0,access-token,google-oauth,Oauth 2.0,Access Token,Google Oauth,我有一个基于web的应用程序,它使用GoogleOAuth2.0作为登录框架。直到昨天,它一直工作得很好。访问令牌过期后,应用程序无法获取刷新令牌。除此之外,“权限请求”页面已改为“离线访问”,而不是“知道你在谷歌上是谁”和“查看你的电子邮件” 最初,“请求许可”页面将请求访问“知道你在谷歌上是谁”和“查看你的电子邮件”。用户注销并尝试第二次登录后,“权限请求”页面也将相同 然而,直到昨天,“许可请求”页面才改为“离线访问”。访问令牌过期后,我收到以下错误消息: PHP致命错误:未捕获异常“Go
$client->setAccessType('online')代码>。然而,我还是犯了这个致命的错误。下面是我获取访问令牌的代码:
if ($client->getAccessToken()) {
$token = $client->getAccessToken();
$authObj = json_decode($token);
$refreshToken = $authObj->refresh_token;
$user = $oauth2->userinfo->get();
$me = $plus->people->get('me');
$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL); // get the USER EMAIL ADDRESS using OAuth2
$optParams = array('maxResults' => 100);
$activities = $plus->activities->listActivities('me', 'public', $optParams);
$_SESSION['access_token'] = $client->getAccessToken();
} else {
$authUrl = $client->createAuthUrl();
}
我试着像我一样寻找类似的问题,但我找不到。这件事从昨天起就发生了。在此之前,我从未对代码做过任何更改 法比安·帕泽法尔通过他的评论帮助我修复了这个问题
这是我的剧本:
if($client->isAccessTokenExpired()) {
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
}
其实很简单。我没有让他点击“连接我”按钮(由GA API团队提供的演示脚本所示),而是直接给他重定向。
不确定这是否是正确/安全的方法,但这是目前适合我的方法 上面的答案是“正确”的,但我只是想把它放在哪里(!)。。。因此,如果其他人尝试了以令牌过期(!)而告终的示例,请发表此文章
if($client->isAccessTokenExpired()) {
$client->authenticate();
$NewAccessToken = json_decode($client->getAccessToken());
$client->refreshToken($NewAccessToken->refresh_token);
}
一旦您的代码完成了它需要的任何令牌,并且您的客户机拥有一个访问令牌。。。然后检查它是否仍然有效,如果不是,则发送重新授权
// Stuff to do with getting tokens and storing in session etc...
if ($client->getAccessToken()) { // Hey! we got one!
if($client->isAccessTokenExpired()) { // Oh! its not good - go for another
$authUrl = $client->createAuthUrl();
header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
exit();
}
try{
...
}
据我所知,他们的安全管理有了一些改变。如果你现在可以访问某个应用程序,谷歌会知道你将来需要什么权限并保存它们,如果你想拥有新的权限或离线访问权限,只会再次询问你。我想,这是他们更新系统时出现的一个临时错误,因为我现在没有遇到任何问题。更新:你说得对,我也不能再使用刷新令牌了…你能告诉我如何摆脱这个问题吗?你能解释一下吗,这个解决方案是如何导致API批准您的访问令牌的?这段代码实际上并不是关于获取您的访问令牌,而是为了防止用户每5分钟登录一次应用程序。很抱歉,我很久没有接触过这段代码了,所以我现在无法提供帮助…authenticate()需要从身份验证系统传回的代码。我让它工作了,但似乎有一个无休止的循环,正如我所知,当页面加载时,令牌会一直过期。我必须取消设置所有保存并在重定向时传递令牌和状态的会话,但我不明白为什么不能取消设置保存的令牌。我怀疑该状态与令牌一起使用,但我无法调查它,不得不继续。