Google OAuth

Login com Google via OAuth 2.0 e Passport.

Setup no Google Cloud

Antes de usar, configure as credenciais no Google Cloud Console:

  1. Acesse console.cloud.google.com
  2. Crie um projeto ou selecione um existente
  3. Va em APIs & Services > Credentials
  4. Clique em Create Credentials > OAuth Client ID
  5. Escolha Web Application
  6. Em Authorized redirect URIs, adicione:
    http://localhost:3001/api/auth/google/callback
  7. Copie o Client ID e Client Secret

Variaveis de ambiente

GOOGLE_CLIENT_ID=123456789-abc.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-your-secret-here
GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback

Implementacao por framework

NestJS — Passport Strategy

Usa @nestjs/passport com a estrategia passport-google-oauth20:

@Injectable()
export class GoogleStrategy extends PassportStrategy(Strategy, 'google') {
  constructor(configService: ConfigService) {
    super({
      clientID: configService.get('GOOGLE_CLIENT_ID'),
      clientSecret: configService.get('GOOGLE_CLIENT_SECRET'),
      callbackURL: configService.get('GOOGLE_CALLBACK_URL'),
      scope: ['email', 'profile'],
    });
  }

  async validate(accessToken, refreshToken, profile, done) {
    const user = {
      email: profile.emails?.[0]?.value,
      name: profile.displayName,
      googleId: profile.id,
      avatar: profile.photos?.[0]?.value,
    };
    done(null, user);
  }
}

Controller com guards:

@Get()
@UseGuards(AuthGuard('google'))
async googleAuth() {
  // Redireciona para o Google
}

@Get('callback')
@UseGuards(AuthGuard('google'))
async googleCallback(@Req() req, @Res() res) {
  const user = req.user;
  // Criar/buscar usuario no banco, gerar JWT
  res.redirect(process.env.APP_URL);
}

Express — Passport middleware

passport.use(new GoogleStrategy({
  clientID: process.env.GOOGLE_CLIENT_ID,
  clientSecret: process.env.GOOGLE_CLIENT_SECRET,
  callbackURL: process.env.GOOGLE_CALLBACK_URL,
}, async (accessToken, refreshToken, profile, done) => {
  const user = {
    email: profile.emails?.[0]?.value,
    name: profile.displayName,
    googleId: profile.id,
  };
  done(null, user);
}));

googleRouter.get('/', passport.authenticate('google', { scope: ['profile', 'email'] }));
googleRouter.get('/callback', passport.authenticate('google', { session: false }), handler);

Fastify — Redirect manual

Para Fastify, o PlazerCLI gera um fluxo manual de redirect com troca de code:

app.get('/api/auth/google', async (request, reply) => {
  const url = `https://accounts.google.com/o/oauth2/v2/auth?client_id=${clientId}....`;
  reply.redirect(url);
});

app.get('/api/auth/google/callback', async (request) => {
  const { code } = request.query;
  // Trocar code por tokens, buscar perfil
});

Fluxo completo

  1. Usuario clica em "Login com Google" no frontend
  2. Frontend redireciona para /api/auth/google
  3. Backend redireciona para Google OAuth consent screen
  4. Usuario autoriza e Google redireciona para /api/auth/google/callback
  5. Backend recebe o perfil do Google (email, nome, foto)
  6. Backend cria ou busca o usuario no banco
  7. Backend gera um JWT e redireciona para o frontend com o token