单页应用程序中的安全认证/授权

时间:2016-08-20 20:02:08

标签: security authentication oauth authorization jwt

我正在构建以下内容:

  • JavaScript单页应用程序;
  • Node.js后端公开RESTful API,它将存储用户数据;

用户凭据(电子邮件/密码)可以通过单页应用程序创建,并存储在后端。不需要与外部提供商进行交互,例如Facebook Login,,但将来可能有必要。

一旦用户使用其凭据进行身份验证,单页面应用程序就应通过其RESTful API与后端进行交互。

我很难理解如何基于凭据设置用户身份验证和授权,其方式既安全又兼容单页应用程序的约束。

我找到了有关 OAuth 2.0 JSON网络代币的信息。我无法想象我应该使用这些技术实现我的最终目标的方式,无论它们是应该一起工作还是独立工作,而且我很难意识到每个技术带来的陷阱。

您是否可以提供所需步骤和组件的演练,以便为具有自定义后端的单页面应用程序构建成功的身份验证/授权机制,如果可能,还可以涵盖以下主题:

  • 与JWT或其他方法相比,使用OAuth 2.0的好处/缺点;
  • 使用Cookie而不是以不同方式存储令牌(例如LocalStorage)和安全隐患;

1 个答案:

答案 0 :(得分:0)

您可以在没有JWT的情况下使用不带Oauth2和Oauth2的JWT,也可以一起使用它们。

请记住,OAuth2管理授权而不是身份验证。 OAuth2不介意如何验证您的用户。要处理身份验证,tou可以查看OpenId Connect,这是Oauth2之上的一个层。 OpenId Connect将向您的应用程序发送一个包含有关用户身份信息的签名id_token。

使用OpenId Connect对用户进行身份验证后,您可以与OAuth服务器联系以获取access_token(无论是否为JWT)。此令牌将用于联系您的API。对于SPA应用,建议使用Implicit Grant flow

对于JWT,它用于id_token(来自OpenId Connect),可用于access_token(OAuth2)。对于access_token,您的令牌可以通过引用(推荐用于SPA)或按值。

通过引用,您的令牌对于客户端是不透明的(例如guid)。按值,您的令牌是可解析的,客户端可以读取包含的数据。

对于要使用的组件,我个人使用RedHat的Keycloak

希望它有所帮助。