Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
谷歌登录api oauth php。我不了解整个流程_Php_Api_Oauth - Fatal编程技术网

谷歌登录api oauth php。我不了解整个流程

谷歌登录api oauth php。我不了解整个流程,php,api,oauth,Php,Api,Oauth,好的,我已经使用非常糟糕的Google文档通过PHP和OAUTH创建了一个Google登录 到目前为止,我可以让人们登录,这方面的事情似乎很好。然而在我注销我的网站后,我的所有会话都被清除,然后下次我用谷歌登录按钮登录时,它会将我发送到一个授权页面,上面写着“请求脱机访问” 所以我搜索并溢出,发现这是因为仍然有一个有效的访问令牌。然后我试图撤销令牌。然后再次点击谷歌登录按钮,然后再次提示我授权。这一次与第一次相同,电子邮件和个人资料。比离线访问更好,但看起来很奇怪,因为我已经第一次授权了这个应用

好的,我已经使用非常糟糕的Google文档通过PHP和OAUTH创建了一个Google登录

到目前为止,我可以让人们登录,这方面的事情似乎很好。然而在我注销我的网站后,我的所有会话都被清除,然后下次我用谷歌登录按钮登录时,它会将我发送到一个授权页面,上面写着“请求脱机访问”

所以我搜索并溢出,发现这是因为仍然有一个有效的访问令牌。然后我试图撤销令牌。然后再次点击谷歌登录按钮,然后再次提示我授权。这一次与第一次相同,电子邮件和个人资料。比离线访问更好,但看起来很奇怪,因为我已经第一次授权了这个应用

好的,下一个想法是,将令牌存储在cookie中,这样当会话在注销时清除时,带有令牌的cookie将不会清除。然后简单地创建一个规则,说明如果cookie存在而会话不存在,则使会话值与cookie相同。这可以正常工作,直到cookie死亡或过期。然后下一次,轰。。。。再次单击“登录”按钮以取消脱机访问

从本质上讲,它工作得很好,但是cookie在某个时候不可避免地会过期,我想完全证明这一点。我只能认为我没有正确理解流程。我已经使用facebook登录4年了,我想,嘿,让我们设置一个只需要5分钟的Google登录。Lol 24小时后我在这里发布到Stack.:/

有人能给我提个建议吗

下面的代码片段

 $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';