Como adicionar um novo provedor
A arquitetura foi pensada para que um novo provedor (ex: Philips Hue, Google Calendar, etc.) não exija tocar em rotas, autenticação ou no dispatcher genérico do dispositivo. Passos:
- Crie a pasta
backend/src/providers/<seu-provider>/. - Implemente o client HTTP (
client.ts) — chamadas cruas à API do provedor (troca de código, refresh, chamadas de ação). Vejabackend/src/providers/spotify/client.tscomo referência. - Implemente as ações (
actions.ts) — umRecord<string, ProviderAction>onde cada chave se torna o segmento de rota/device/v1/<seu-provider>/<acao>. CadaProviderActiontem:method:"GET"ou"POST".handler({ accessToken, binding, input }): faz a chamada real e retorna um JSON simplificado (pense do ponto de vista de um firmware com pouca memória — não repasse a resposta bruta do provedor).
- Implemente o adapter (
adapter.ts), satisfazendo a interfaceProviderAdapterdebackend/src/providers/types.ts:getAuthorizeUrl— monta a URL de autorização OAuth do provedor.exchangeCodeForTokens— trocacode(+codeVerifierdo PKCE) por tokens.refreshAccessToken— renova o access token usando o refresh token.fetchIdentity— busca um identificador estável da conta no provedor (usado para não duplicarProviderConnectionse o usuário reconectar).actions— o objeto do passo 3.
- Registre o provider em
backend/src/providers/registry.ts, adicionando uma linha aoproviderRegistry. - Nenhum outro arquivo precisa mudar — as rotas de OAuth
(
/api/v1/providers/:provider/connect|callback), o dispatcher de dispositivo (/device/v1/:provider/:action) e oTokenBrokerjá operam de forma genérica sobre a interface.
Checklist de segurança ao adicionar um provedor
- Nunca retorne o
accessToken/refreshTokenbruto em nenhum handler de ação — apenas dados derivados (nome da música, status, etc.). - Se o provedor não usar PKCE, ainda assim gere e valide o
code_verifierlocalmente (o backend simplesmente não o envia ao provedor) — mantém a consistência do fluxo genérico deoauth-state.service.ts. - Trate explicitamente o caso de refresh falhar (token revogado pelo
provedor) — o
TokenBrokerjá marca a conexão comoNEEDS_REAUTHautomaticamente ao capturar uma exceção dorefreshAccessToken.