Google+登录:验证会话用户

时间:2014-04-30 12:40:30

标签: google-plus single-sign-on google-oauth google-authentication

我对在网站中集成Google+ sign-in按钮表示怀疑。

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

我的另一个问题是,我应该如何在登录期间保持会话?我已经考虑过以下方法,

  1. 使用我们自己的会话:从Google获取用户身份验证,在登录回调时,设置自定义应用Cookie以验证更多呼叫。 问题:如果用户从gmail等其他谷歌服务注销,我的会话不会终止。
  2. 使用Google访问令牌作为会话密钥:每次请求任何PHP时,都要验证Google访问令牌。 问题:我必须向google API发出一个额外的HTTP请求来验证每个PHP调用。它会使我的应用程序有点慢。
  3. 在每个PHP的客户端利用signinCallback:在signinCallback函数中,如果用户无效,则拒绝他访问页面。 问题:不是100%安全。用户可以在客户端修改我的signinCallback并绕过谷歌会话验证。然后,即使从谷歌退出后,他也可以享受会议。
  4. 还有另一种权利和更安全的方式吗?请注意,我的网站是简单的HTML 4.0网站,它几乎执行服务器端的每个操作。几乎没有Javascript,用户i / o由表单执行。所以服务器端技术更受欢迎:)

2 个答案:

答案 0 :(得分:5)

  

在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_token和id_token。将这些令牌发送到OAuth.v2.verifytoken端点将检查令牌证书是否有效且令牌是否已过期。 Verifytoken还将为您返回一个唯一的标识符,您可以使用该标识符来验证用户未使用错误的会话。

Google+ PHP Quickstart向您展示了如何将授权码发送到您的服务器,接受并exchange the code, verify the token, and so on in PHP

所以,你应该做的是:

  1. 通过客户端身份验证将OAuth 2凭据传递到服务器
  2. 验证服务器上的凭据并在用户会话失败时断开连接
  3. 在用户通过身份验证后依靠您的网站会话
  4. 如果您想在退出Google时签署用户,请在每次加载页面时检索OAuth 2凭据,并在每个请求中传递令牌(ID /访问/一次性代码)并进行验证。

答案 1 :(得分:0)

现在使用侦听器或gapi.auth2.getAuthInstance()。currentUser.get()。reloadAuthResponse()与登录按钮请求离线访问的整个过程,将一次性授权代码发送给您服务器,并为访问令牌和刷新令牌交换auth代码。

请参阅https://developers.google.com/identity/sign-in/web/listenershttps://developers.google.com/identity/sign-in/web/reference#googleuserreloadauthresponse

相关问题