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:
- Acesse console.cloud.google.com
- Crie um projeto ou selecione um existente
- Va em APIs & Services > Credentials
- Clique em Create Credentials > OAuth Client ID
- Escolha Web Application
- Em Authorized redirect URIs, adicione:
http://localhost:3001/api/auth/google/callback - 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
- Usuario clica em "Login com Google" no frontend
- Frontend redireciona para
/api/auth/google - Backend redireciona para Google OAuth consent screen
- Usuario autoriza e Google redireciona para
/api/auth/google/callback - Backend recebe o perfil do Google (email, nome, foto)
- Backend cria ou busca o usuario no banco
- Backend gera um JWT e redireciona para o frontend com o token