WeeShip

Connectors

Microsoft 365

Microsoft 365 (Outlook + OneDrive)

Connecteur OAuth (Authorization Code), par utilisateur : chaque utilisateur connecte SON compte Microsoft. Les jetons sont chiffrés au repos. Reproduit le connecteur graph de Stackeo (mail Outlook + OneDrive).

1 — Créer l'app registration Azure

Sur le portail Azure (gratuit, un compte Microsoft suffit) : portal.azure.com.

  1. Va sur portal.azure.com et connecte-toi (idéalement avec le compte dont tu testeras l'adresse M365).
  2. Barre de recherche en haut → « App registrations » (Inscriptions d'applications).
  3. Clique « + New registration » (Nouvelle inscription).
  4. Name : « WeeAgent M365 ». Supported account types : « Accounts in any organizational directory and personal Microsoft accounts ».
  5. Redirect URI : plateforme « Web » + colle l'URL de callback (voir encadré ci-dessous). Puis « Register ».
  6. Sur Overview : copie l'« Application (client) ID » → c'est MS_CLIENT_ID.
  7. Certificates & secrets → « + New client secret » → copie tout de suite la colonne « Value » (pas « Secret ID ») → c'est MS_CLIENT_SECRET (elle ne se réaffiche jamais).
  8. API permissions → + Add a permission → Microsoft Graph → Delegated permissions → coche : offline_access, User.Read, Mail.Read, Mail.Send, Files.Read → Add permissions.
Redirect URI = <SUPABASE_URL>/functions/v1/ms-oauth-callback. Trouve <SUPABASE_URL> dans Supabase → Project Settings → API → Project URL (ex. https://abcd1234.supabase.co). Il doit correspondre EXACTEMENT (sinon Microsoft renvoie « redirect_uri mismatch »).

2 — Renseigner les secrets (Supabase)

1supabase secrets set \
2  MS_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
3  MS_CLIENT_SECRET=la_valeur_du_secret \
4  OAUTH_ENCRYPTION_KEY=une_longue_phrase_aleatoire \
5  APP_URL=https://ton-app.com
6# MS_TENANT est optionnel (défaut : common)

3 — Appliquer la migration & déployer

1supabase db push                                        # applique 0007_oauth_connections
2supabase functions deploy ms-oauth-start ms-graph
3supabase functions deploy ms-oauth-callback --no-verify-jwt
ms-oauth-callback DOIT être déployée avec --no-verify-jwt : c'est une redirection navigateur depuis Microsoft, sans JWT Supabase. La sécurité vient du state signé (HMAC).

4 — Connecter & utiliser

Sur la page Connecteurs, le bouton « Connecter » (carte Microsoft 365) lance le consentement Microsoft, puis renvoie sur l'app. Le statut passe à « ● Connecté ». Le proxy ms-graph (auth JWT, refresh automatique) expose ensuite des actions :

1// POST <SUPABASE_URL>/functions/v1/ms-graph
2{ "action": "mail_list", "limit": 10 }
3{ "action": "mail_send", "to": "x@y.com", "subject": "…", "body": "…" }
4{ "action": "onedrive_list", "path": "Documents" }
5{ "action": "status" }

Actions Graph

  • status — état de connexion (sans jeton).
  • me — profil (nom, email).
  • mail_list — derniers mails Outlook (objet, expéditeur, date, aperçu).
  • mail_send — envoi d'un mail (to, subject, body).
  • onedrive_list — fichiers/dossiers OneDrive (racine ou path).

Depuis WeeAgent

Active l'option microsoft sur le provider pour donner ces outils (lecture seule) a l'agent :

1<WeeAgentProvider bridge={bridge} microsoft>
2  <WeeAgentDock title="Copilot" />
3</WeeAgentProvider>

L'agent peut alors repondre a : « liste mes derniers mails Outlook », « qu'y a-t-il dans mon OneDrive », « mon profil Microsoft ». Outils : mail_list, onedrive_list, me.

L'envoi de mail (mail_send) n'est PAS expose comme outil autonome : l'agent ne peut pas envoyer un mail seul. Si le compte n'est pas connecte, l'agent invite a le connecter (page Connecteurs).

Sécurité (comment ça marche)

  • Jetons chiffrés au repos (AES-GCM via OAUTH_ENCRYPTION_KEY, _shared/crypto.ts).
  • Table oauth_connections : RLS activée sans policy → accès uniquement via des RPC SECURITY DEFINER (service_role).
  • Le state OAuth est signé HMAC (porte le user_id, expire en 10 min) → anti-CSRF, sans table de states.
  • Le token est rafraîchi automatiquement par ms-graph quand il expire.
Scopes délégués : offline_access, User.Read, Mail.Read, Mail.Send, Files.Read. Pour ajouter le calendrier : Calendars.Read + l'endpoint /me/events.

Dépannage

  • « redirect_uri mismatch » → l'URI Azure ne correspond pas exactement à <SUPABASE_URL>/functions/v1/ms-oauth-callback.
  • not_connected (409) → l'utilisateur n'a pas encore cliqué « Connecter ».
  • Erreur de token → vérifie MS_CLIENT_SECRET (la Value, pas le Secret ID) et OAUTH_ENCRYPTION_KEY.