在React Native Expo App中无需密钥即可解码JWT令牌

时间:2019-06-11 14:30:20

标签: react-native jwt decode

我的应用当前正在博览会上运行,我需要一种方法来解码从后端收到的JWT令牌。当我使用jwt.io时,它不需要密钥来解码,但是我似乎找不到支持展览的库,该库不需要密钥来解码。我尝试使用下面的代码在没有库的情况下对其进行解码,但是它不起作用:-

JSON.parse(new Buffer(token.split(‘.’)[1], ‘base64’.toString())); 

我尝试使用一些expo库,但是我发现的所有库都需要一个密钥才能解码,如果我将空字符串传递给该密钥,它将无法解码。 我还尝试了在没有库的情况下进行解码

预期的结果是通过jwt.io解码我的JWT令牌后的以下对象:

{
  "id": "5ce667c89133fd61e7f08c53",
  "name": "TEST Group",
  "username": "chia.wq@redtech.my",
  "type": "G",
  "iat": 1560152565
}

在Expo上使用React Native时,我是否有其他方法可以在没有密钥的情况下进行解码?

2 个答案:

答案 0 :(得分:0)

JWT密钥仅在此处用于对令牌进行签名,因此,可以在没有密钥的情况下提取数据。

您唯一缺少的是缓冲区不是在Base64中编码的,而是在“ URL Base64”中编码的。

在将令牌部分传递给Buffer之前,您必须将所有'-'替换为'+',并将所有'_'替换为'/'。

const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';

const parts = token.split('.').map(part => Buffer.from(part.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString());

const payload = JSON.parse(parts[1]);

console.log('JWT payload', payload);

答案 1 :(得分:0)

我的解决方案

1 / npm install buffer

2 / import { Buffer } from "buffer"

3 / const parts = responseJson.token.split('.').map((part) => Buffer.from(part.replace(/-/g, '+').replace(/_/g, '/'),'base64').toString());