最初,我的身份验证正常。然后我离开计算机,再次返回编码,这一次,我的身份验证失败并显示以下消息
[GraphQL错误]:消息:上下文创建失败:您的会话已结束。请重新登录,位置:未定义,路径:未定义
我为令牌设置了到期时间。我尝试在登录前清除缓存,但仍然收到上述错误。
下面是我登录功能的代码
_handleSubmit = (values, bag, signIn) => {
signIn({
variables: {
email: values.email,
password: values.password
}
})
.then(async ({ data }) => {
if (data && data.signIn.token) {
await AsyncStorage.setItem("token", data.signIn.token);
this.props.navigation.navigate("Main");
}
})
.catch(err => {
bag.setSubmitting(false);
bag.setErrors(err);
});
};
我的堆栈是apollo,mongodb,react-native。我怀疑问题可能是缓存。我试图清除缓存,但是通过按“ R”清除Expo上的缓存,但是我仍然无法登录。
[更新]错误是由于jwt令牌过期引起的。我在getUser函数中使用console.log(@res,res)时收到此错误
{TokenExpiredError:jwt已过期...
有趣的是,我为每个登录创建了一个新的jwt令牌。以下是我的createToken和getUser代码
有人遇到过这种情况吗?您如何解决?
const createToken = (user, expiresIn) => {
const { _id, email } = user;
//creturn jwt.sign({ _id, email }, process.env.SECRET_KEY, { expiresIn });
return jwt.sign({ _id, email }, process.env.SECRET_KEY);
};
const getUser = async token => {
if (token) {
try {
const res = await jwt.verify(token, process.env.SECRET_KEY);
console.log("@res ", res);
return res;
} catch (error) {
console.log("@error ", error);
throw new AuthenticationError(
"Your session has ended. Please sign in again"
);
}
}
};
谢谢
答案 0 :(得分:0)
我在ApolloClient的authLink中运行...
await AsyncStorage.removeItem("token");
然后将其注释掉,n又可以正常工作!
const authLink = setContext(async (req, { headers }) => {
// await AsyncStorage.removeItem("token");
const token = await AsyncStorage.getItem("token");
console.log("@token ", token);
return {
headers: {
...headers,
authorization: token ? `${token}` : ""
}
};
});
答案 1 :(得分:0)
请确保您不要在前端的标头中将 undefined
作为令牌发送。通常在 App.js 中,当未经授权的用户尝试登录时。