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

Gab*_*lli 5 security authentication authorization oauth jwt

我正在构建以下内容:

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

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

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


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

我找到了有关OAuth 2.0JSON Web令牌的信息.我无法想象我应该使用这些技术实现我的最终目标的方式,无论它们是应该一起工作还是独立工作,而我正在努力意识到每个技术带来的陷阱.


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

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

sty*_*yix 0

您可以在不使用 Oauth2 的情况下使用 JWT,也可以在不使用 JWT 的情况下使用 Oauth2,或者将它们一起使用。

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

使用 OpenId Connect 对用户进行身份验证后,您可以联系 OAuth 服务器以获取 access_token(无论是否为 JWT)。该令牌将用于联系您的 API。对于 SPA 应用程序,建议使用隐式授予流程。

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

通过引用,您的令牌对客户端来说是不透明的(例如 GUID)。根据值,您的令牌是可解析的,并且客户端可以读取其中包含的数据。

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

希望能帮助到你。