谷歌登录api oauth php。我不了解整个流程
好的,我已经使用非常糟糕的Google文档通过PHP和OAUTH创建了一个Google登录 到目前为止,我可以让人们登录,这方面的事情似乎很好。然而在我注销我的网站后,我的所有会话都被清除,然后下次我用谷歌登录按钮登录时,它会将我发送到一个授权页面,上面写着“请求脱机访问” 所以我搜索并溢出,发现这是因为仍然有一个有效的访问令牌。然后我试图撤销令牌。然后再次点击谷歌登录按钮,然后再次提示我授权。这一次与第一次相同,电子邮件和个人资料。比离线访问更好,但看起来很奇怪,因为我已经第一次授权了这个应用 好的,下一个想法是,将令牌存储在cookie中,这样当会话在注销时清除时,带有令牌的cookie将不会清除。然后简单地创建一个规则,说明如果cookie存在而会话不存在,则使会话值与cookie相同。这可以正常工作,直到cookie死亡或过期。然后下一次,轰。。。。再次单击“登录”按钮以取消脱机访问 从本质上讲,它工作得很好,但是cookie在某个时候不可避免地会过期,我想完全证明这一点。我只能认为我没有正确理解流程。我已经使用facebook登录4年了,我想,嘿,让我们设置一个只需要5分钟的Google登录。Lol 24小时后我在这里发布到Stack.:/ 有人能给我提个建议吗 下面的代码片段谷歌登录api oauth php。我不了解整个流程,php,api,oauth,Php,Api,Oauth,好的,我已经使用非常糟糕的Google文档通过PHP和OAUTH创建了一个Google登录 到目前为止,我可以让人们登录,这方面的事情似乎很好。然而在我注销我的网站后,我的所有会话都被清除,然后下次我用谷歌登录按钮登录时,它会将我发送到一个授权页面,上面写着“请求脱机访问” 所以我搜索并溢出,发现这是因为仍然有一个有效的访问令牌。然后我试图撤销令牌。然后再次点击谷歌登录按钮,然后再次提示我授权。这一次与第一次相同,电子邮件和个人资料。比离线访问更好,但看起来很奇怪,因为我已经第一次授权了这个应用
$gClient = new Google_Client();
$gClient->setApplicationName('*Login to mywebsitehidenfromtheworld*');
$gClient->setClientId($clientId);
$gClient->setClientSecret($clientSecret);
$gClient->setRedirectUri($redirectUrl);
$gClient->setAccessType('online');
$gClient->setApprovalPrompt('auto') ;
$google_oauthV2 = new Google_Oauth2Service($gClient);
if($_COOKIE['*mycookienamehiddenfromtheworld*'] && !$_SESSION['token']){
$_SESSION['token'] = unserialize($_COOKIE['GplusUser']);
}
if($_COOKIE['*mycookienamehiddenfromtheworld*'] && !$_SESSION['token']){
$_SESSION['token'] = unserialize($_COOKIE['GplusUser']);
}
if(isset($_REQUEST['code'])){
$gClient->authenticate();
$_SESSION['token'] = $gClient->getAccessToken();
header('Location: ' . filter_var($redirectUrl, FILTER_SANITIZE_URL));
}
if (isset($_SESSION['token'])) {
$gClient->setAccessToken($_SESSION['token']);
setcookie("*mycookienamehiddenfromtheworld*" ,serialize($_SESSION['token']),
mktime (0, 0, 0, 12, 31, 2020), '/');
}
if ($gClient->getAccessToken()) {
$userProfile = $google_oauthV2->userinfo->get();
$gUser = new UsersGP();
$_SESSION['token'] = $gClient->getAccessToken();
stuff happening here with checking DB etc, then proceeding to member area
(working fine)
} else {
$authUrl = $gClient->createAuthUrl();
}
if(isset($authUrl)) {
echo '<a href="'.$authUrl.'"><img src="images/glogin.png" alt=""/></a>';
} else {
echo '<a href="logout.php?logout">Logout</a>';
}
如果我不使用这些代码并使用第一块代码中的cookie方法,那么在cookie过期或被删除之前,它是可以使用的。然后又回到要求离线访问
B:如果A的答案是否定的,那么我错过了什么来防止这种情况发生
使用Facebook登录,很简单,只需授权应用程序权限1次,那么即使请求了新的访问令牌,您也不必重新授权权限,当然,除非权限已被撤销。因此,当facebook登录请求一个新令牌时,即使有一个活动令牌,也不会提示任何用户交互,它只会返回一个新令牌,然后再次退出。那么为什么谷歌与众不同呢?更重要的是,无需再次授权,实现此功能的正确方法是什么
提前谢谢
----编辑
我刚刚发现了以下内容,但它似乎很奇怪。请任何人确认或否认以下内容。特别是,如果浏览器中不存在cookie,则此部分:应用程序将显示“具有脱机访问权限”
引述
这不是一个错误。这是google oauth2的正常场景
第一道工序同意书如下:
用户同意应用程序获取有关用户的信息。
当用户单击“接受”按钮时,浏览器将把同意信息保存到cookie中,谷歌帐户将保存“请查看”权限
从第二个过程:
浏览器检查谷歌账户的cookie许可证
如果浏览器中存在cookie并且具有此应用程序的权限
:同意
屏幕将被忽略
如果浏览器中存在cookie,但不具有
将显示此应用程序:同意屏幕
如果浏览器中不存在cookie:应用程序将显示“具有脱机访问权限”
我似乎在努力使我的问题变得清晰,但这有助于,最后一部分,如果饼干不再存在。。。如果令牌仍然处于活动状态,但浏览器没有,则会创建一个新实例$gClient->createAuthUrl;已经创建了。然后,当解析该url时,即单击登录按钮,它将显示脱机访问请求。我的问题是。如何避免这种情况
引用自本页已解决
src/auth/Google_OAuth2.php的第36行和第37行
public $accessType = 'offline';
public $approvalPrompt = 'force';
改为
public $accessType = 'online';
public $approvalPrompt = 'auto';
问题已修复。是否在客户端javascript中注销会话?当我使用Google登录时,我必须执行gapi.auth.signOut来结束Google会话。在我使用$gClient->revokeToken;-然后,下次我登录时,它会提示我再次授权电子邮件和配置文件。我刚刚看到另一个堆栈溢出用户说,这是正确的方法,但它看起来很奇怪,没有太多逻辑意义。直接更改库代码通常不是一个好主意,因为如果您想更新库,您所做的更改将丢失。另外,我认为您使用的是旧版本的google客户端,最好使用它,新版本不再使用公共属性。
public $accessType = 'online';
public $approvalPrompt = 'auto';