在 React Native Expo 应用程序中无需密钥即可解码 JWT 令牌

zer*_*993 2 decode jwt react-native

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

\n\n
JSON.parse(new Buffer(token.split(\xe2\x80\x98.\xe2\x80\x99)[1], \xe2\x80\x98base64\xe2\x80\x99.toString())); \n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试过使用一些博览会库,但我发现的所有库都需要一个密钥来解码,如果我将空字符串传递给密钥,它就不会解码。\n我也尝试过在没有库的情况下进行解码

\n\n

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

\n\n
{\n  "id": "5ce667c89133fd61e7f08c53",\n  "name": "TEST Group",\n  "username": "chia.wq@redtech.my",\n  "type": "G",\n  "iat": 1560152565\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有其他方法可以让我在没有密钥的情况下通过使用或不使用 Expo 上的 React Native 中的库进行解码?

\n

Seb*_*dej 7

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

您唯一缺少的是缓冲区不是以 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);

Run Code Online (Sandbox Code Playgroud)