我正在尝试将 Auth0 身份验证添加到我的单页应用程序中。我的应用程序在一个域下运行,例如 app.mycompany.com,而此应用程序使用的 api 在另一个域下运行,例如 api.mycompany.com。
我知道这个线程:
单页应用程序 (SPA) 的单点登录 (SSO) 解决方案/架构
以及此处链接的 auth0 文章和 github 存储库。但我感觉我的场景稍微简单一些,因为我不一定希望在几个不同的单页应用程序之间进行单点登录。首先,我只想要 API 和应用程序之间的分离。
这是我已经尝试过的:
我已经从文章React Login With Auth0 开始并下载了启动项目。我肯定可以毫无问题地登录,它会在我的 localStorage 中留下一个 id_token,其中包含由 Auth0 发布的 JWS。
我也可以直接登录 api.mycompany.com(我的 FeathersJS API 应用程序),我可以看到在 OAuth 重定向过程中,id_token 令牌神奇地转换为我的 Feathers 应用程序发出的包含内部 ID 的 feathers-jwt 令牌与 auth0-ID 匹配的用户对象。我还实现了用于从 Auth0-ID 映射到我的内部 ID 的逻辑。此外,我所有的 Feathers 钩子(例如验证令牌和用户数量)都在工作。
我无法弄清楚的是如何使用 localStorage 中的 Auth0 令牌更改在 app.mycompany.com 下运行的 react-application,以便此令牌由 api.mycompany.com 转换为 feathers-jwt 令牌,在这样的这样所有后续的 API 调用都会自动包含 feathers-jwt 令牌,以便 API 可以验证用户并返回正确的数据。
任何有关如何进行的建议将不胜感激。
更多背景细节:
- 该 api 建立在 node.js 和 featherjs 上(基本上是 Express 的扩展)
- 单页应用程序基于 ReactJS 构建,由一个简单的 Express 服务器提供服务,但它可以由任何可以通过 http 提供静态文件的服务器提供服务。单页应用程序向 api 发出 http 请求以读取数据并执行操作。
该 api 具有以下代码行来处理身份验证:
const authentication = require('feathers-authentication'); const Auth0Strategy = require('passport-auth0').Strategy; app.configure(authentication({ local:false, token: { secret: 'mysecret', payload: ['email', 'auth0Nickname'], issuer: 'mycompany' }, idField: 'id', shouldSetupSuccessRoute: false, auth0: { strategy: Auth0Strategy, domain: 'mycompany.eu.auth0.com', 'clientID': 'xxx', 'clientSecret': 'yyy' } }));