【发布时间】:2020-05-29 12:37:24
【问题描述】:
对于我目前正在开发的平台,我的雇主决定将身份验证外包给Auth0。
通过在 Auth0 上打开一个托管页面并在成功登录/注销后重定向到我们的平台,我们设法让登录和注销流程正常工作。
使用电子邮件和密码成功登录后,Auth0 会返回以下格式的响应:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlEwWTFRemREUlRW...",
"expires_in": "86400",
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IlEwWTFRemREUlRWRk9V...",
"scope": "openid email",
"state": "my-custom-state",
"token_type": "Bearer"
}
根据the official Auth0 documentation,Auth0 允许通过两种方法更新现有的授权令牌:
- 静默身份验证请求,用于尚未过期的令牌
- 隐藏 iframe 中的静默令牌请求,用于已过期的令牌
静默身份验证请求
文档告诉我应该向以下 URL 发出请求:
https://████████████████████/authorize
?response_type=id_token token&
client_id=...&
redirect_uri=...&
state=...&
scope=openid...&
nonce=...&
audience=...&
response_mode=...&
prompt=none
当我在浏览器的任何选项卡中打开此 URL 时,如果此 redirect_uri 列在 Auth0 配置中,我确实会正确重定向到 redirect_uri。并在# 之后将新令牌添加到url。
但是,无论是从后端(Node.js / Nuxt)还是前端(Vue / Nuxt),我都无法让它与 XHR 一起使用。当我尝试从前端执行此操作时,我的浏览器抱怨此资源未设置 CORS 标头。当我尝试从后端执行此操作时,我找不到将凭据传递给 URL 的方法。
更新过期令牌
我找不到任何关于如何在不使用 auth0.js library 的情况下更新过期令牌的演示代码示例,如果可能的话我宁愿不使用它。
当我在本地安装 auth0.js 库后尝试使用他们的演示时,填写所有这些字段后,我什至无法进行简单的登录:
这是我得到的错误:
{
"original": {
"error": "request_error",
"error_description": "{\"crossDomain\":true,\"method\":\"POST\",\"url\":\"https://████████████████████/co/authenticate\"}"
},
"code": "request_error",
"description": "{\"crossDomain\":true,\"method\":\"POST\",\"url\":\"https://████████████████████/co/authenticate\"}",
"error": "request_error",
"error_description": "{\"crossDomain\":true,\"method\":\"POST\",\"url\":\"https://████████████████████/co/authenticate\"}"
}
谁能帮我弄清楚如何在黑地中正确实现刷新,无论是过期的还是未过期的 Auth 令牌?
更新
我设法更进一步,通过...
- 将
SilentAuthenticationHandler从Auth0.js移植到我的项目中 - 注释掉
SilentAuthenticationHandler中的一行,以防止在/authorize端点位于不同域中时浏览器崩溃 - 使用具有
response_modeweb_message的URL 和与我的audience对应的postMessageOrigin的值创建SilentAuthenticationHandler的实例 - 在隐藏的 iframe 中调用
SilentAuthenticationHandler, withusePostMessageset totrue, to open the/authorize` 端点上的login方法 - 解析作为
redirect_uri传递的callback页面的URL 中的哈希,然后使用Window.parent.postMessage(parsedParams, '*')将其发送回主窗口
在完成所有这 5 个步骤后,我终于得到了我的新访问令牌和 id 令牌。
不幸的是,我不知道如何使用这些新凭据更新我的 Nuxt。我在 @nuxtjs/auth 包中寻找灵感,但我能想到的最好的东西是这样的:
this.$auth.setUserToken(token);
我尝试将其与例如。 fetchUser 和 setUser,但无论我尝试什么,它都会继续 *** 我的会话并在重新加载时触发 400 错误。
我做错了什么?
【问题讨论】:
-
为什么要自己实现身份验证流程和令牌更新?您是在使用任何库还是手动执行所有操作?
-
如果您在浏览器中使用 SPA,您应该考虑使用“带有 PKCE 的授权码”流程作为目前最安全的流程。
-
@VladimirSerykh :正如我在问题中提到的,我们的平台在Nuxt 上运行。我们确实使用a Nuxt plugin 来简化登录和注销,但我找不到任何关于如何更新我的令牌的信息。但你是对的:我可能应该先在他们的 Github 页面上记录一个问题......我现在就这样做!
-
@VladimirSerykh :我一直在研究 Nuxt 插件和 Auth0.js 库,这让我更进一步。我现在确实设法获得了我的访问令牌,但我找不到用它来更新我的 Nuxt 的方法!
标签: javascript node.js oauth-2.0 nuxt.js auth0