使用Auth0和客户端node.js服务器在SPA中进行身份验证

时间:2017-01-13 21:49:03

标签: javascript node.js express oauth-2.0 auth0

背景

我有两个应用程序:

  • Angular2单页应用
  • Node.JS with express

我想通过使用快速服务器公开的API来验证和授权用户登录Angular2应用程序。我想使用Auth0作为我的IDP。我希望整个应用程序(客户端+服务器)是量身定制的。 同时:

  1. 我不想使用Auth0 Lock
  2. 我不想使用刷新和重定向(用于精细用户体验和简化流程)
  3. 我不想将auth0.js库发送到Angular2应用程序(以最大限度地减少负载和客户端代码复杂性)。
  4. 我想保留服务器在localStorage中返回的auth数据(而不是passport.js设置cookie和刷新)
  5. 最好是,我不想为这些目的设置数据库,尽管它是可能的。
  6. 建议的架构

    红色箭头表示身份验证流程 5是通用API请求 proposed architecture

    实际问题

    1. 使用这种架构有禁忌吗?
    2. 我如何实现它以及我需要通过4个请求/响应中的每一个? (最简单的方案和先决条件)?
    3. 对于这个领域的初学者,是否有任何资源可以帮助我更好地理解OAuth和身份验证?

1 个答案:

答案 0 :(得分:1)

Q1

鉴于OAuth2对其指定的功能的很大一部分使用HTTP重定向,使用诸如那样的体系结构并强加许多约束将减少可以利用的可能性的数量。除此之外,我没有看到任何重大问题。

Q2

鉴于您不想使用重定向,您需要使用的OAuth2流是资源所有者密码授予(ROPC),主要是因为OAuth2提供的四个流是唯一一个会满足你的要求。

  • ❌授权代码授予(基于重定向)
  • ❌隐式授权(基于重定向)
  • ✅资源所有者密码授予
  • ❌客户端凭据授权(针对希望代表自己而不是最终用户访问API的客户端应用程序)

在请求1和2中,您将用户名和密码凭据首先传递到您自己的服务器,然后传递给授权服务器。在请求3和4中,由成功的用户身份验证产生的访问令牌被传递到AngularJS应用程序,该应用程序可以将其存储在localStorage中供以后使用。

这符合您的确切要求,但它并不是最常用的架构。通常,SPA将使用隐式授权来获取访问令牌。鉴于此授权已针对此目的进行了优化,因此可以实现良好的UX特性,但是,它确实会使用重定向。

Q3

OAuth2 specification itself对眼睛来说并不难,这将是我推荐的最佳资源。为了更高层次和快速介绍该主题,我还建议https://auth0.com/docs/protocols/oauth2