You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native项目使用jsonwebtoken遇crypto模块未找到错误求助

React Native中jsonwebtoken解码时crypto模块缺失的解决办法

你遇到的问题核心是jsonwebtoken库依赖Node.js的crypto模块,而React Native运行环境不支持这个模块。以下是几种可行的解决办法:

方案一:改用RN专用的JWT解码库

最省心的办法是替换为专门适配React Native的@react-native-community/jwt-decode,它完全不需要依赖Node.js的核心模块:

  1. 安装依赖
npm install @react-native-community/jwt-decode
# 或者用yarn
yarn add @react-native-community/jwt-decode
  1. 修改你的校验代码
import jwtDecode from '@react-native-community/jwt-decode';

const checkToken = token => { 
  try { 
    const decodedToken = jwtDecode(token); 
    const expirationTime = decodedToken.exp;
    const expirationDate = new Date(expirationTime * 1000);
    const currentDate = new Date(); // 补充之前缺失的当前时间定义

    if (expirationDate > currentDate) {
      console.log('Token is still valid', expirationDate);
      return true;
    } else {
      console.log('Token is expired', expirationDate);
      return false;
    }
  } catch(err) {
    console.log(err);
    return false;
  }
}

方案二:修复rn-nodeify的配置(保留jsonwebtoken)

如果你坚持要用jsonwebtoken,检查以下配置是否到位:

  • 确保已安装rn-nodeify开发依赖:
npm install rn-nodeify --save-dev
  • 执行命令生成shim文件并完成hack:
npx rn-nodeify --install crypto,assert,url,stream,events --hack
  • 在项目入口文件(比如index.js或App.js)的最顶部导入生成的shim:
import './shim.js';
  • 最后重启Metro服务并清除缓存:
npx react-native start --reset-cache

注意:每次执行npm install后,postinstall脚本会自动重新执行hack操作,确保配置生效。

方案三:手动解码token(无第三方库依赖)

如果只是单纯校验token是否过期,不需要验证签名,可以手动解析JWT,完全不需要任何库:

const checkToken = token => {
  try {
    // JWT结构是header.payload.signature,取中间的payload部分
    const payloadBase64 = token.split('.')[1];
    // 处理URL安全的Base64编码(JWT会把+换成-,/换成_)
    const normalizedBase64 = payloadBase64.replace(/-/g, '+').replace(/_/g, '/');
    // 解码并转为JSON对象
    const decodedPayload = JSON.parse(atob(normalizedBase64));
    
    const expirationTime = decodedPayload.exp;
    const expirationDate = new Date(expirationTime * 1000);
    const currentDate = new Date();

    if (expirationDate > currentDate) {
      console.log('Token is still valid', expirationDate);
      return true;
    } else {
      console.log('Token is expired', expirationDate);
      return false;
    }
  } catch (err) {
    console.log(err);
    return false;
  }
}

内容的提问来源于stack exchange,提问作者Mini Badri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:12:52