【问题标题】:How to get user role from jwt token如何从 jwt 令牌获取用户角色
【发布时间】:2018-01-09 12:51:29
【问题描述】:

在服务器端,我有这些代码可以登录:

return jsonify({'email': email, 'token': create_token(email, isAdmin, password)})

在客户端我需要代码来检查登录和 isAdmin。

isLogged() {
if (localStorage.getItem('currentUser') &&
    JSON.parse(localStorage.getItem('currentUser')).email) {
  return true;
}
return false;
}

isAdmin(){
  //???
}

如何从令牌中获取用户角色?

【问题讨论】:

  • 您是否尝试过对其进行解码以查看声明? See this question
  • 我只有服务器端有密钥,客户端没有。
  • 您不需要密钥来解码负载。它是一个 json 对象 base64url 编码
  • 也许你可以给我同样的解码payload的例子?

标签: angular token jwt


【解决方案1】:

假设你有这个 JWT (example from here)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

您可以使用something like this 对其进行解码:

let jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ'

let jwtData = jwt.split('.')[1]
let decodedJwtJsonData = window.atob(jwtData)
let decodedJwtData = JSON.parse(decodedJwtJsonData)

let isAdmin = decodedJwtData.admin

console.log('jwtData: ' + jwtData)
console.log('decodedJwtJsonData: ' + decodedJwtJsonData)
console.log('decodedJwtData: ' + decodedJwtData)
console.log('Is admin: ' + isAdmin)

【讨论】:

  • 这个解决方案绝对有效,因为我刚刚自己测试过。无论如何,我对使用 window.atob(...) 没有信心,因为它看起来如此......而不是 Angular'ish。它有点像用 JS 进行的旧式编程。不过,这可能只是我无知。该操作是否有更类似于 TypeScript 的语法?特别是如果它被打包在 JWT 相关库中。毕竟 - 所有 JWT 令牌都将包含三个部分,我们只想看到中间一个的解码版本,对吧?
  • 我认为使用 atob 是可以的。有人可以在 typescript 中重新实现 atob 并将其作为 npm 包放置,但我想不出会解决什么问题。您可能遇到的唯一问题是浏览器可以以不同的方式实现 atob,但我认为如果它们无法编码/解码 base64,您可能会遇到更大的浏览器问题。
猜你喜欢
  • 2021-04-07
  • 2021-06-01
  • 2022-06-13
  • 1970-01-01
  • 2020-09-12
  • 2020-05-05
  • 2021-07-05
  • 2020-09-06
  • 2017-05-26
相关资源
最近更新 更多