工具:Django + Next.js + Django-GraphQL-JWT
工作原理:我可以登录用户并获得一个 JWT 令牌,除了将令牌保存在 localStorage 中以供稍后检索和验证之外,我还保存了该令牌。
什么不起作用:我可以成功检索 localStorage 令牌,但是当我尝试使用库来验证服务器上的令牌时,我收到此错误:
[GraphQL error]: Message: Error decoding signature, Location: [object Object], Path: verifyToken
验证码:
const [authToken, setAuthToken] = useState(null);
const [localToken, setLocalToken] = useState();
useEffect(() => {
setLocalToken(localStorage.getItem("token"));
}, []);
...
const verifyToken = async () => {
const client = createApolloClient();
const data = await client.mutate({
mutation: verifyMutation,
variables: { token: localToken },
});
if (data) {
setAuthToken(data.data.tokenAuth.token);
}
return data;
};
...
突变:
export const verifyMutation = gql`
mutation VerifyToken($token: String!) {
verifyToken(token: $token) {
payload
}
}
`;
架构.py:
class Mutation(graphene.ObjectType):
token_auth = graphql_jwt.ObtainJSONWebToken.Field()
verify_token = graphql_jwt.Verify.Field()
refresh_token = graphql_jwt.Refresh.Field()
revoke_token = graphql_jwt.Revoke.Field()
这是我在 GraphQL 中手动尝试时会发生的情况:
如果我的突变包括令牌:
mutation VerifyToken($token: String!) {
verifyToken(token: "token_string_here") {
payload
}
}
返回:
{
"errors": [
{
"message": "Variable '$token' is never used in operation 'VerifyToken'.",
"locations": [
{
"line": 1,
"column": 22
}
],
"path": null
}
]
}
但是,如果我不包含这样的令牌:
mutation VerifyToken {
verifyToken {
payload
}
}
返回:
{
"data": {
"verifyToken": {
"payload": {
"username": "myname",
"exp": 1623076467,
"origIat": 1623076167
}
}
}
}
我尝试过的其他事情:我发现一些关于 SECRET_KEY 是解码问题的参考,但我已经在我的设置中设置了它,但问题没有任何改善。我还没有找到任何其他似乎可以在这里工作的解决方案。
我也尝试过使用自定义 JWT_VERIFY 模块,但这并没有帮助我解决问题。