如何将NestJS/passport与React Native/Expo集成实现认证授权?
NestJS/Passport 与 React Native Expo 认证集成思路
核心逻辑
你当前的纯客户端Google OAuth认证要对接NestJS后端,核心是让后端验证Google颁发的accessToken合法性,然后签发属于自己服务的JWT——只有这样后端才能基于自己的token实现授权控制、用户与数据库文档关联等功能。
具体步骤拆解
1. 后端配置(NestJS + Passport)
- 安装依赖:
npm install @nestjs/passport passport-google-oauth20 @nestjs/jwt passport-jwt - 配置Google Token验证策略:
创建GoogleStrategy,使用passport-google-oauth20的Strategy,设置clientID、clientSecret,并指定passReqToCallback: true,在回调里调用Google的API验证accessToken的有效性。 - 新增认证端点:
创建POST /auth/google接口,用@UseGuards(AuthGuard('google-token'))保护,在接口处理函数中:- 从
req.user拿到验证后的Google用户信息(如邮箱、ID) - 查询数据库,存在该用户则直接返回,不存在则创建新用户记录
- 用
JwtService签发自己服务的JWT(Payload包含用户ID、权限等必要信息),把JWT和用户基础信息一起返回给客户端
- 从
2. 客户端修改(React Native Expo)
你需要调整当前的认证流程,把Google返回的accessToken传给后端换取服务自有JWT:
- 修改
response监听的useEffect:
useEffect(() => { if (response?.type === 'success') { const exchangeTokenWithBackend = async () => { try { const backendRes = await fetch('http://你的后端域名/auth/google', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ accessToken: response.authentication.accessToken, }), }); const authData = await backendRes.json(); // 存储后端返回的JWT和用户信息,而非Google的token await AsyncStorage.setItem('auth', JSON.stringify(authData)); setAuth(authData); } catch (err) { console.error('后端认证失败:', err); } }; exchangeTokenWithBackend(); } }, [response]);
- 后续请求后端接口时,在请求头添加
Authorization: Bearer ${你的JWT},后端通过AuthGuard('jwt')验证token合法性
3. 后端授权与用户关联
- 用
@UseGuards(AuthGuard('jwt'))装饰需要保护的路由,只有携带有效JWT的请求才能访问 - 在受保护路由的处理函数中,通过
req.user获取当前用户信息,实现数据库文档与用户的关联(比如创建文档时自动填充userId字段)
对你问题的直接解答
- 是的,你需要新增后端认证路由来接收客户端发送的Google accessToken,验证后签发自有JWT。
- 把
promptAsync()和后端请求包装到一个函数里是完全正确的做法——这一步是实现前后端认证打通的关键。
替代方案
- 如果不想自己管理JWT,可以考虑用Passport的Session认证,但移动端场景下无状态的JWT更适配。
- 也可以直接把Google返回的用户信息(如邮箱、姓名)传给后端创建用户,但这种方式不如验证accessToken安全,因为用户信息存在被伪造的风险,而验证accessToken是通过Google官方API确认合法性的。
内容的提问来源于stack exchange,提问作者TLS
相关产品推荐
相关产品推荐

