我已经使用带有react和hook的自定义输入设置了Auth0。我正在尝试保护我的路线,以便用户根据我们的API指示路线的位置以及从中返回的信息。为此,我在setSession内设置了用户数据,但是该项未定义返回/与auth0Client.client.userInfo
无关,而setSession功能尚未完成。
const setSession = async authResult => {
const expiresAt = JSON.stringify(
authResult.expiresIn * 1000 + new Date().getTime()
)
localStorage.setItem('access_token', authResult.accessToken)
localStorage.setItem('id_token', authResult.idToken)
localStorage.setItem('expires_at', expiresAt)
localStorage.setItem('auth', true)
setAuthenticated(true);
await auth0Client.client.userInfo(authResult.accessToken, (err, user) => {
localStorage.setItem('user', JSON.stringify(user))
setUser(JSON.stringify(user));
})
}
我在句柄身份验证中调用setSession:
const handleAuthentication = () => {
console.log("auth0Client", auth0Client);
if (typeof window !== 'undefined') {
auth0Client.parseHash(async (err, authResult) => {
if (authResult && authResult.accessToken && authResult.idToken) {
await setSession(authResult);
history.replace('/');
} else if (err) {
console.log(err)
return err;
}
})
}
}
我尝试返回值并改为通过以下方式调用它:
await setSession(authResult).then(
() => history.replace('/')
)
无论哪种方式,它第一次访问我想要的路由时,其用户的值为空。
我在此处放置了完整的模拟回购。您可以创建帐户,如果要创建其他帐户,请使用带有+ modifier /示例test+1@test.com
的同一封电子邮件https://github.com/Sbphillips19/ManualAuth0Flow
我敢肯定这很简单,我刚刚反复尝试了100种不同的方式,但看不到它。
答案 0 :(得分:0)
我会给Jim和Jfriend00答案,但是由于这是评论,我无法使用Bluebird给出答案:
await new Bluebird(function (resolve, reject) {
auth0Client.client.userInfo(authResult.accessToken, (err, user) => {
if (err) return reject(err)
resolve(user);
})
}).then(
data =>
{
localStorage.setItem('user', JSON.stringify(data))
setUser(JSON.stringify(data));
}
)
似乎auth0讨论了将其所有功能转换为能够使用异步等待的问题,但目前bluebird会这样做!