Node JS - Problemas de integração com IdentityServer4
Os pacotes de node para OAuth 2.0 tem muito o que melhorar. São limitados e exige que o desenvolvedor adapte seu servidor de OAuth 2.0 para utilizar o componente.
Se no seu ambiente há um IdentityServer4. E na empresa houver uma diversidade de tecnologias, como Node. Os times que desenvolvem nessa plataforma terão problemas com um AuthServer IdentityServer4.
Componentes
Se uma API node precisar validar um Bearer Token. E esse token não foi gerado por um servidor OAuth 2.0 da Okta ou Auth0. Você terá problemas para integrar com outros AuthServer, por exemplo seu IdentityServer4.
Ao fazer uma busca por componentes que façam validação de Access Token, JWT ou Bearer Token. Vai encontrar artigos e componentes desenvolvidos pela Okta ou Auth0. Por exemplo:
- @okta/jwt-verifier - Okta
- jwks-rsa - Auth0
- jsonwebtoken - Auth0
Todos esses componentes só aceitam algoritmos RSA. Sendo que a RFC atualmente indica o uso de ECDsa.
Por exemplo, o Custom Authorizer da Okta, utiliza o projeto node-lambda-oauth2-jwt-authorizer. Que permite apenas Bearer token JWT e não suporta Reference Tokens. Além de suportar apenas algoritmos RSA, não pode haver mais de uma Audience
(Algo extremamento comum de acontecer com um token emitido pelo IdentitySerevr4.
Esses componentes trabalham, quase que exclusivamente no formato de configuração que o servidor de OAuth 2.0 destas empresas te impõe.
O problema
Adapta-los em um cenário onde o Auth Server é diferente exige que o desenvolvedor adquira um conhecimento sobre OAuth 2.0 acima do básico. Isso dificulta a adoção.
Abre espaço para adaptações duvidosas. Em certos cenários exige mudanças na configuração do seu IdentityServer4, impactando não só suas API's como também seu Client frontend.
Se você utiliza o IdentityServer4, certamente não consegue utilizar algumas das implementações. Nesse exemplo aa Okta não permite que o Token tenha mais de um Audience. Cenário que é comum usando o IdentityServer4. Já nos primeiros tutoriais, você verá JWT's como esse:
Configurar seu IdentityServer4 para que não tenha mais de um Audience, gera impactos nas implementações de suas aplicações.
Quer dizer que eles são ruins?
Longe disso, um dos escritores da RFC 6750 é arquiteto de segurança da Okta. Inclusive é a Okta que mantém o site OAuth 2.0.
Talvez os melhores materiais de OAuth 2.0 é proveniente da Auth0.
O problema é que os componentes possuem forte acoplamento com a empresa que o disponibiliza. Dificultando a adoção em outros ambientes. Como o IdentityServer4, por exemplo.
E o .NET ?
Os componentes do .Net são excelentes. Sem sombra de dúvida, os melhores. As implementações seguem as RFC's. E permite integrar com qualquer servidor de OAuth 2.0.
Eles não tem restrições de algoritmo. Aceitando quase todos mencionados na RFC. RSA e ECDsa.
Há uma clara separação de conceitos entre Resource Server e Client. Com certa frequencia os artigos escritos em outras tecnologias tendem a não ter uma distinção quando uma API é Client e quando a API é um Resource Server. Dificultando não só o entendimento do protocolo. Como também abrindo caminho para implementações duvidosas.
Se alguém quer aprender sobre OAuth 2.0, defenderia o IdentityServer4 como a melhor escola de conceitos.
Alternativas
Por falta de alternativas, tive a iniciativa de criar dois componentes em Node JS. Para facilitar a criação de API's node integradas a um Auth Server OAuth 2.0.
Access Token Validation
Esse pacote foi baseado no IdentityModel.AccessTokenValidation
, do time do IdentityServer4. Ele permite fazer validações tanto de um Bearer Token, quanto de um Reference Token. Aceita algoritmos RSA e ECDsa. E segue o mesmo exemplo de configuração que há no Asp.Net.
Está disponivel no meu Github
Custom Authorizer
É um modelo de Custom Authorizer para o API Gateway da Amazon. Utiliza o Access Token Validation por baixo. Permitindo que o API Gateway faça validação dos tokens com qualquer servidor de OAuth 2.0, sem restrição de Audience.
Disponível no meu GitHub
Typescript
Ambos escritos com typescript. Já que é muito comum em nossa comunidade.
Conclusão
Em outro momento farei um tutorial para ensinar como configurar o API Gateway e também fazer essa integração com o IdentityServer4.
Nesse momento, estou apenas compartilhando para tentar ser rápido e efetivo. Assim consigo ajudar você e outros desenvolvedores mais rápido. Um tutorial demora mais.
Espero que tenha gostado e te ajudado! Deixe seu comentário!
Download
Os projetos: