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

React+TS对接Nest Google授权后,前端如何获取存储Token?

问题核心

OAuth2授权是浏览器端的跳转流程,并非AJAX请求,所以不能用axios直接调用/auth/google/callback。需要调整后端回调逻辑,让它完成授权后跳回前端并携带Token,再由前端从URL中提取Token存入localStorage。


解决方案步骤

1. 修改Nest后端的Google回调接口

将原接口直接返回JSON的逻辑,改为授权成功后跳转到前端页面,把Token作为查询参数传递:

@Get('google/callback')
@UseGuards(AuthGuard('google'))
async googleAuthRedirect(@Req() req, @Res() res) {
  const tokens = await this.authService.googleLogin(req);
  // 跳转到前端poll页面,携带Token参数
  return res.redirect(`http://localhost:5173/poll?access_token=${tokens.access_token}&refresh_token=${tokens.refresh_token}`);
}

2. 前端React处理Token存储

在/poll页面组件中,挂载时读取URL查询参数,提取Token存入localStorage,同时清除地址栏中的Token参数:

import { useEffect } from 'react';
import { useNavigate, useSearchParams } from 'react-router-dom';

const PollPage = () => {
  const [searchParams] = useSearchParams();
  const navigate = useNavigate();

  useEffect(() => {
    const accessToken = searchParams.get('access_token');
    const refreshToken = searchParams.get('refresh_token');
    
    if (accessToken && refreshToken) {
      // 存入localStorage
      localStorage.setItem('access_token', accessToken);
      localStorage.setItem('refresh_token', refreshToken);
      // 清除URL中的Token参数,避免泄露
      searchParams.delete('access_token');
      searchParams.delete('refresh_token');
      navigate({ search: searchParams.toString() }, { replace: true });
    }
  }, [searchParams, navigate]);

  return <div>Poll页面内容</div>;
};

export default PollPage;

3. 前端登录按钮实现直接跳转

登录按钮不要用axios,直接通过页面跳转打开后端授权地址:

const LoginButton = () => {
  const handleGoogleLogin = () => {
    window.location.href = 'http://localhost:3333/auth/google';
  };

  return <button onClick={handleGoogleLogin}>Google登录</button>;
};

export default LoginButton;

额外注意事项

  • 确保Nest后端配置正确的CORS规则,允许前端域名请求:
    // main.ts中
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      app.enableCors({
        origin: 'http://localhost:5173',
        credentials: true,
      });
      await app.listen(3333);
    }
    bootstrap();
    
  • 若担心URL暴露Token的安全性,可考虑用后端设置HttpOnly Cookie传递refresh_token,access_token仍需存在前端用于API请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:46:22