gpt4 book ai didi

javascript - 从现有的 id_token 获取 Auth0 access_token

转载 作者:行者123 更新时间:2023-12-03 05:36:19 26 4
gpt4 key购买 nike

我正在使用auth0验证我对单页应用程序(基于 React 构建)的登录。我主要使用基本 API 调用(列出 here )。

我正在使用的过程是:

当用户在我的应用程序的登录页面上输入用户名/电子邮件和密码时获取用户名/电子邮件和密码使用这些值向 /oauth/ro 发送 POST 请求 - 这是代码:

export const login = (params, err) => {
if (err) return err
const {email, password} = params
const {AUTH0_CLIENT_ID, AUTH0_DOMAIN} = process.env
return fetch(`${AUTH0_DOMAIN}/oauth/ro`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
'client_id': AUTH0_CLIENT_ID,
'username': email,
'password': password,
'connection': 'Username-Password-Authentication',
'grant_type': 'password',
'scope': 'openid',
'device': '',
'id_token': ''
})
})
.then(response => response.json())
.then(json => {
const {id_token, access_token} = json
setCookieValue('id_token', id_token) // utility function I wrote
return getProfile(access_token)
.then(data => {
const {user_id, email: emailAddress, picture, name} = data
return {id_token, user_id, emailAddress, picture, name}
})
})
.catch(error => console.log(`ERROR: ${error}`))
}

这一切都是通过 Redux 发送的,并且用户已登录(假设用户名/密码正确)。

但是,我试图弄清楚如何在刷新页面/返回应用程序时保持登录。我将 id_token (即 JWT )保存在浏览器的 cookie 中,并且可以在应用程序呈现服务器端时获取它。我可以解码 JWT 并获取有效负载(sub 是来自 auth0 的用户 ID)。但是,要获取配置文件数据,我需要 Auth0 在使用 /oauth/ro POST 请求时提供的 access_token 。显然,如果 JWT token 已过期,那么它只会拒绝它并让用户保持注销状态。

这是我解码 JWT 的代码(发生在应用程序渲染上):

const ID_TOKEN = req.cookies.id_token || false
if (ID_TOKEN) {
verifyJwt(ID_TOKEN, (err, decoded) => {
if (err) { console.log(`JWT Verification error: ${err}`) }
else {
const {sub} = decoded
getProfile(sub).then(data => store.dispatch(fetchUserDetails(data))) // fails as `sub` (the user id) is not the `access_token` which it requires
}
})
}

我再次尝试使用 /oauth/ro 调用,但这次指定 "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer"并使用从cookie中检索的id_token,并指定设备。但是,当我执行此调用时,我从 Auth0 收到此错误:

{
"error": "invalid_request",
"error_description": "there is not an associated public key for specified client_id/user_id/device"
}

所以我的问题是,我需要调用什么 API 才能从 id_token JWT 获取 access_token

此外,作为奖励 - 当我执行 POST 登录请求时,密码 正在通过明文传输。当发送到 auth0 时我将如何加密它以便他们可以解密回来?我认为它涉及使用 auth0 提供的 client_secret 但我不确定如何去做。

最佳答案

通过使用 refresh tokens 可以实现以编程方式刷新 token 而无需任何类型的用户交互。 。但是,这不适用于基于浏览器的应用程序,因为刷新 token 是长期凭据,浏览器的存储特性会使它们面临更大的泄露风险。

如果您想继续使用资源所有者密码凭据授予,您可以选择在 token 过期时要求用户再次输入凭据。作为替代方案,通过身份验证,您可以获得所需的用户信息并启动应用程序特定的 session 。这可以通过让服务器端逻辑创建应用程序特定的 session 标识符或 JWT 来实现。

您还可以停止使用资源所有者密码凭据授予,并将用户重定向到 Auth0 身份验证页面,该页面除了将 token 返回到您的应用程序之外,还会为用户维护经过身份验证的 session ,这意味着当 token 过期并且您的应用程序再次重定向到 Auth0,用户可能不需要手动重新输入凭据,因为 Auth0 session 仍然有效。

关于以明文发送的密码;资源所有者端点依赖于 HTTPS,因此数据在协议(protocol)级别进行加密。您还必须在自己的应用程序中使用 HTTPS 进行任何类型的通信,包括任何类型的用户凭据。

另请注意,您可以通过使用范围来控制 ID token 中返回的内容,具体取决于相关信息的数量,如果您signal that you want that information to be contained within the ID token itself,您甚至可能不需要进行额外的调用来获取用户配置文件。 .

关于javascript - 从现有的 id_token 获取 Auth0 access_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40722553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com