如何从jwt令牌获取用户角色

Dzo*_*uSi 6 token jwt angular

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

return jsonify({'email': email, 'token': create_token(email, isAdmin, password)})
Run Code Online (Sandbox Code Playgroud)

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

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

isAdmin(){
  //???
}
Run Code Online (Sandbox Code Playgroud)

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

0mp*_*rdy 19

说你有这个JWT(这里的例子)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
Run Code Online (Sandbox Code Playgroud)

你可以用这样的东西来解码它:

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)
Run Code Online (Sandbox Code Playgroud)

  • 正如我自己测试过的那样,此解决方案肯定有效。即便如此,我似乎对使用* window.atob(...)*没有信心,因为它看起来...不是Angular'ish。它有点像使用JS的旧编程。不过,可能只是我无知。该操作是否还有TypeScript类的语法?特别是如果它包装在JWT相关库中。毕竟-所有JWT令牌都将包含三个部分,我们只希望看到中间部分的解码版本,对吗? (3认同)
  • 我认为使用atob很好。有人可以在 typescript 中重新实现 atob 并将其作为 npm 包放置,但我不认为这会解决什么问题。您可能遇到的唯一问题是浏览器可以以不同的方式实现 atob,但我认为如果它们无法编码/解码 base64,您可能会遇到该浏览器更大的问题。 (2认同)