Google plus 谷歌+;登录:验证会话用户

Google plus 谷歌+;登录:验证会话用户,google-plus,single-sign-on,google-oauth,google-authentication,Google Plus,Single Sign On,Google Oauth,Google Authentication,我有一个在网站上集成按钮的疑问 我的问题是,在signinCallback中获得的google访问令牌有效期有多长?这个期限灵活吗?我可以在到期前多次使用它从谷歌中提取用户信息吗 我的另一个问题是,在登录期间我应该如何维护会话?我已经想到了以下方法 使用我们自己的会话:从Google获得用户身份验证,在登录回调时,设置自定义应用程序cookie以验证进一步的调用。 问题:如果用户从其他谷歌服务(如gmail)注销,我的会话不会终止 使用google访问令牌作为会话密钥:每次请求任何PHP时都对g

我有一个在网站上集成按钮的疑问

我的问题是,在signinCallback中获得的google访问令牌有效期有多长?这个期限灵活吗?我可以在到期前多次使用它从谷歌中提取用户信息吗

我的另一个问题是,在登录期间我应该如何维护会话?我已经想到了以下方法

  • 使用我们自己的会话:从Google获得用户身份验证,在登录回调时,设置自定义应用程序cookie以验证进一步的调用。 问题:如果用户从其他谷歌服务(如gmail)注销,我的会话不会终止
  • 使用google访问令牌作为会话密钥:每次请求任何PHP时都对google访问令牌进行身份验证。 问题:我必须向GoogleAPI发出一个额外的HTTP请求来验证每个PHP调用。这会使我的申请有点慢
  • 在每个PHP中利用客户端的signinCallback:在signinCallback函数中,若用户无效,则拒绝他访问页面。 问题:不是100%安全。用户可以在客户端修改我的signinCallback并绕过google会话验证。然后,即使在从谷歌注销后,他也可以享受这个会话
  • 有没有另一种正确且更安全的方法?请注意,我的网站是一个简单的HTML4.0网站,它在服务器端执行几乎所有操作。几乎没有Javascript,用户i/o由表单执行。因此,服务器端技术更受欢迎:)

    在signinCallback中获得的google访问令牌有效多长时间

    3600秒(1小时)

    这个期限灵活吗

    否。访问令牌将始终在一小时后过期。但是,您可以使用刷新令牌将过期的访问令牌替换为新令牌。为此,必须在“登录”按钮上请求脱机访问,将一次性授权代码发送到服务器,并将身份验证代码交换为访问令牌和刷新令牌

    我可以在到期前多次使用它从谷歌中提取用户信息吗

    除非用户断开与应用程序的连接,否则您将能够获得新的访问令牌并进行API调用

    我应该如何在登录期间维护会话

    使用您自己的站点会话来维护站点的用户状态。听起来您的站点上已经有了会话,如果会话存在并且包含站点所需的任何授权密钥,则应该授权用户

    使用google访问令牌作为会话密钥:

    请不要这样做,您需要保护用户的访问令牌。您可以做的一件稍微安全的事情是从登录回调传递访问令牌,然后验证它是否对应于服务器上的会话缓存用户

    更好的方法 这是你真正应该做的。使用“登录”按钮回调确定用户未登录,并在未登录时使任何会话无效。将ID令牌或一次性授权代码从回调传递到服务器,以对用户进行身份验证。以下代码显示了调用错误条件的平均登录回调:

    function onSignInCallback(authResult) {
      if (authResult['access_token']) {
        // User is signed in.
      } else if (authResult['error']) {
        // There was an error, which means the user is not signed in.
        // As an example, you can handle by writing to the console:
        console.log('not signed in, invalidating session');          
      }
      console.log('authResult', authResult);
    }
    
    如您所知,authResult对象包含成员access\u令牌和id\u令牌。将这些令牌发送到端点将检查令牌证书是否有效以及令牌是否已过期。Verifytoken还将向您返回用户的唯一标识符,您可以使用该标识符验证该用户是否正在使用不正确的会话

    显示如何将授权代码发送到服务器、接受和

    所以,同样,你应该做的是:

  • 在客户端身份验证时向服务器传递OAuth 2凭据
  • 验证服务器上的凭据,如果失败,请断开用户会话
  • 一旦用户通过身份验证,就依赖您的站点会话
  • 如果您想在用户注销Google时注销用户,请在每次页面加载时检索OAuth 2凭据,并在每个请求上传递令牌(ID/access/one time code)并进行验证
    现在使用侦听器或gapi.auth2.getAuthInstance().currentUser.get().reloadAuthResponse()来完成以下整个过程:在登录按钮上请求脱机访问,将一次性授权代码发送到服务器,并将授权代码交换为访问令牌和刷新令牌


    请参见和。

    Hey@class,感谢您提供的详细答案!!我只是想问一些额外的信息,我可以多次使用access token在到期前从google中提取用户信息吗?换句话说,如果我使用相同的令牌值多次调用,它是否有效?除非令牌已过期或无效,否则对verifyToken(accessToken)的API调用将返回true-对同一访问令牌的多次检查与第一次检查的行为相同。我在网站中设置了一个只有我才能访问的部分。我使用谷歌登录(也想知道它是如何工作的)。身份验证后,我将为每个呼叫验证用户令牌。目前(仍在测试尚未部署)我正在会话中保存access_令牌(我将把它保存在DB中)我有一个案子是。。。当我注销我的google帐户时,验证令牌仍然返回用户信息。。。正如我所想,注销帐户也会使访问令牌无效。在这种情况下,我想我应该遵循你上面的观点。是否可以选择用户是否注销?注销您的帐户用于在客户端上切换帐户。ID令牌仍应能够用于验证令牌的颁发者/订阅者。