【问题标题】:AdonisJS doesn't refresh token because Invalid TokenAdonisJS 不刷新令牌,因为无效令牌
【发布时间】:2020-06-13 17:30:30
【问题描述】:

我正在尝试获取向服务器发送发布请求的新访问令牌。我正在使用邮递员发送刷新令牌,处理此问题的函数在本段下方。服务器响应为 E_INVALID_JWT_REFRESH_TOKEN

async refresh({
    request,
    response,
    auth
  }) {
     try {
      const refresh_token = request.input('refresh_token')
      const decrypted = Encryption.decrypt(refresh_token)
      console.log(decrypted)
      const token = await auth.generateForRefreshToken(refresh_token, true)
      console.log('Token is',token)
      return response.status(200).json(token)
     } catch (error) {
       return response.status(401).json(error)
     }
  }

如您所见,我解密了令牌,一切正常。也检查一下数据库,没问题。

显然我不是唯一遇到此错误的人,并且在 GitHub 中关闭了一个问题

更新:

这是我的配置/auth.js

jwt: {
    serializer: 'LucidMongo',
    model: 'App/Models/User',
    scheme: 'jwt',
    uid: 'email',
    password: 'password',
    options: {
      secret: Env.get('APP_KEY'),
      expiresIn: '60m',
    }
  },

【问题讨论】:

  • 您能否分享一个示例项目,以便我重现该问题? (带配置,...)
  • @CrBast 是一个复杂的项目,但是,查看它的简单方法是向路由 /auth/refresh 发送 POST 请求 - 主体上带有变量 refresh_token - 调用方法 @来自 AuthController 的 987654323@

标签: access-token refresh-token jwt-auth adonis.js


【解决方案1】:

+ 字符有问题。此字符的错误在查询字符串中很常见。

如果您记录refresh_token 的结果,您可能会注意到+ 字符被替换为空格。

解决方案

1。您可以使用库将请求转换为queryString

query-string 为例:

var query = queryString.stringify({
  refresh_token:
    "74f7c7e26621d231feb39c4a9c6a76bajOKUVX+J3LG/f4hJQzy3+hgL+p2w0VkRRw6xT/NnVxUofjh/zRVJJyuwGEfoCL+l"
});

输出 (query):

refresh_token=74f7c7e26621d231feb39c4a9c6a76bajOKUVX%2BJ3LG%2Ff4hJQzy3%2BhgL%2Bp2w0VkRRw6xT%2FNnVxUofjh%2FzRVJJyuwGEfoCL%2Bl

2。您可以使用Request Body

https://en.wikipedia.org/wiki/HTTP_message_body

使用此方法,无需对文本进行转换

最佳解决方案取决于您的需求。


有趣的链接

How to include special characters in query strings

Plus sign in query string

HTTP GET with request body

【讨论】:

  • 谢谢!我之前找到了类似的答案,所以在我的情况下,我发出一个 POST 请求并通过请求正文发送refresh_token。你认为我也必须应用这个解决方案吗?
  • 不客气。你的解决方案很好。您可以使用这两种可能性。这取决于您的使用情况。
  • 我将您的解决方案添加到我的答案中。你能告诉我是否有任何改变吗?
  • 我试图添加这个,但它给了我同样的错误。我解密了令牌,因为我怀疑问题可能出在令牌上,没关系。现在,我不知道该怎么办
  • 完成,我添加了我的config/auth.js 文件
【解决方案2】:

这取决于您应用的客户端和服务器之间的字符编码共识。

例如:

客户:

encrypted = toUTF8(Encryption.encrypt(token));

服务器:

decrypted = Encryption.decrypt(fromUTF8(refresh_token))

【讨论】:

  • encryptedUTF8 = CryptoJS.enc.Utf8.stringify(encryptedText); CryptoJS 库:npmjs.com/package/crypto-js。或者:function Utf8(text) { if (/u0080-\uFFFF/.test(text)) text = unescape(encodeURIComponent(text));返回文本; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2017-12-25
  • 2023-02-02
相关资源
最近更新 更多