客户端和服务器端身份验证,用户无需登录两次?

时间:2013-08-27 00:40:15

标签: google-app-engine authentication google-drive-api google-oauth google-drive-realtime-api

是否可以使用客户端和服务器端oauth2身份验证,而无需为每个身份验证单独的用户登录?

跨客户端身份页面似乎正是我想要的,但它没有描述如何为Web客户端和服务器项目实现此目的。 https://developers.google.com/accounts/docs/CrossClientAuth

具体来说,这就是我想要实现的目标: 我有一个Web应用程序,它使用驱动器api创建文件和驱动器实时api用于协作编辑文档,所以我需要进行客户端身份验证。我还想允许用户公开与其他用户共享文档的只读副本。我想通过在谷歌应用引擎中存储文档数据的快照来实现这一点,任何人都可以阅读,但只能由创建谷歌文档的用户编写。这表明我需要服务器端身份验证。但有没有办法做到这一点,而无需用户登录一次进行客户端访问,然后再次进行服务器端访问?

这个问题似乎很相似:Authenticating G+ users on the server side, after client-side login 但接受的答案似乎建议只是在app引擎上存储用户ID并检查客户端的用户ID是否匹配。这似乎只需要知道文件创建者的用户ID覆盖app引擎服务器上的文档,这是不安全的。

2 个答案:

答案 0 :(得分:2)

您可以以安全的方式将服务器组件的访问令牌传递给您的前端,您无需再在客户端进行授权。

答案 1 :(得分:1)

这可能比你想象的要容易。我的应用程序非常相似,因为我从服务器应用程序中执行了一些操作,但主要是用户直接从Javascript访问Drive。

我这样做的方法是在服务器上进行初始授权,因为这样可以更好地控制用户体验,我可以将Google授权与我自己的注册逻辑相结合。结果是我最终得到了我的服务器数据库中的用户记录和存储的访问凭证。

一旦用户获得授权和身份验证,我就会提供javascript应用程序,然后该应用程序可以独立于服务器自由请求访问令牌。 Burcu的答案是正确的,你可以将访问令牌传递给客户端,但由于客户端需要处理令牌到期,我不认为这是一个大赢家(虽然它可以加速初始加载)。

在识别方面,我将google用户ID存储在http会话中。如果客户端请求某些服务器内容,则会话会告诉我该用户是谁(基于Google的私有会话cookie)。因此,无需将用户ID传递给客户端。