import env from '#start/env' import { defineConfig, services } from '@adonisjs/ally' import { microsoftService } from '#services/ally/microsoft_driver' /** * Configuration des providers OAuth (Ally). * * V1 : Google + Microsoft 365 (cf. CLAUDE.md → Auth). * Le callback URL pointe vers l'API (/api/v1/auth/{provider}/callback). * En prod, le reverse proxy nginx (rubis-web) achemine /api/* vers ce * service, donc la même URL fonctionne browser et provider. */ const allyConfig = defineConfig({ google: services.google({ clientId: env.get('GOOGLE_CLIENT_ID', ''), clientSecret: env.get('GOOGLE_CLIENT_SECRET', ''), callbackUrl: env.get( 'GOOGLE_CALLBACK_URL', 'http://localhost:3333/api/v1/auth/google/callback' ), // Scopes minimaux : on a juste besoin de l'email + nom + photo (avatar // optionnel V2). Pas de Drive/Calendar : on ne touche pas aux données // Google de l'utilisateur, on s'en sert juste comme provider d'identité. scopes: ['userinfo.email', 'userinfo.profile'], prompt: 'select_account', }), microsoft: microsoftService({ clientId: env.get('MICROSOFT_CLIENT_ID', ''), clientSecret: env.get('MICROSOFT_CLIENT_SECRET', ''), callbackUrl: env.get( 'MICROSOFT_CALLBACK_URL', 'http://localhost:3333/api/v1/auth/microsoft/callback' ), // tenant=common : accepte work/school (Microsoft 365) ET comptes personnels // (Outlook, Hotmail). Pour limiter à M365 strict, mettre 'organizations'. tenant: env.get('MICROSOFT_TENANT', 'common'), scopes: ['openid', 'profile', 'email', 'User.Read'], prompt: 'select_account', }), }) export default allyConfig declare module '@adonisjs/ally/types' { interface SocialProviders extends InferSocialProviders {} } import type { InferSocialProviders } from '@adonisjs/ally/types'