使用Google身份验证和Google Oauth 2.0登录单页应用程序

时间:2013-01-14 12:25:14

标签: authentication oauth-2.0 single-page-application google-oauth

我们正在开发一个SPA - 完整的客户端基础javascript应用程序,需要对我们的用户进行身份验证才能访问内部。

正如我从搜索中发现的那样,我们可以外包我们的身份验证机制并使用 Google帐户。我从这个网站上学到了 https://developers.google.com/accounts/docs/OAuth2Login - 如何处理Google API和身份验证机制

简而言之,我们需要:

  • 使用params向google网址发送请求,要求用户允许SPA使用其个人数据
  • 如果成功,我们会从Google
  • 获取令牌
  • 我们可以使用此令牌来访问我们被要求并使用它的API。

这个描述得很好,我理解它并且有一些JS代码来实现它。

我不明白

我有一个带有私人数据的应用程序。我想使用用户的电子邮件作为登录或用户ID(无论如何调用它)来访问应用程序的内部,例如用户创建的任务,用户的配置文件等。因此,在我的SPA中显示用户创建的任务我需要使用用户的电子邮件查询数据库。

我想象下一个场景:

  • 用户点击Login with Google按钮
  • 我们获得了一个令牌 - 这意味着用户已成功通过身份验证
  • 我们坚持用户和他的电子邮件与SPA合作
  • 当用户点击Logout时,我们会清除所有访问数据

我应该在哪里保留这些数据?

如果Forms Authentication我知道我们将登录名/密码传递给服务器,如果它们与数据库匹配,我们会创建Forms Ticket将其存储在Cookie 中。

Google的身份验证是否有类似的情况?如果我将用户的电子邮件存储在Cookie中,我认为出于安全原因这不太好。如果我要保存令牌 - 我不确定为什么需要它以及如何在我的SPA中使用它,我在验证后没有使用任何Google API。

您是否有任何示例案例我们如何在类似情况下构建我们的流程?

谢谢。

1 个答案:

答案 0 :(得分:5)

如果您只需要用户的电子邮件地址,那么最好使用OpenID而不是OAuth。 OAuth提供对用户帐户和服务的访问权限,范围限定为特定资源或资源集。 OpendID专为登录第三方服务而设计。然后,您可以从OpenID登录中提取用户的ID和电子邮件地址。注意:将始终发送ID,但在身份验证期间必须明确请求电子邮件地址。

Google还支持混合OpenID + OAuth方案,如果您需要进行身份验证,则可以在OpenID登录之上搭载OAuth请求。 Take a look at the authentication document to get an idea of how both protocols work and which is better for your scenario.

一旦您返回了电子邮件地址,您可能不应该将其保留在Cookie中。通常建议的处理方法是将其添加为会话参数。这样只有会话cookie存储在客户端上,服务器可以使用它找到它需要的值。 This answer has a good explanation of the differences and when you want to use sessions versus cookies.