Autenticação e autorização em seu aplicativo

A segurança é essencial para os aplicativos Web modernos. O Fluid Framework, como parte de sua arquitetura de aplicativo Web, é uma parte importante da infraestrutura para segurança. O Fluid Framework é uma arquitetura em camadas e os conceitos relacionados à autenticação são implementados com base no serviço Fluid ao qual ele está se conectando. Isso significa que, embora exista temas comuns de autenticação em todos os serviços Fluid, os detalhes e as especificações serão diferentes para cada serviço.

Serviço do Azure Fluid Relay

Cada locatário do serviço do Azure Fluid Relay que você cria recebe uma ID de locatário e sua própria chave secreta exclusiva do locatário.

A chave secreta é um segredo compartilhado. Tanto seu aplicativo/serviço quanto o serviço do Azure Fluid Relay o conhecem. Como a chave secreta do locatário está vinculada exclusivamente ao seu locatário, usá-la para assinar solicitações garante ao serviço do Azure Fluid Relay que as solicitações são provenientes de um usuário autorizado do locatário.

A chave secreta é como o serviço do Azure Fluid Relay sabe que as solicitações são provenientes do seu aplicativo ou serviço. Isso é crítico, porque, uma vez que o serviço do Azure Fluid Relay pode confiar que seu aplicativo está fazendo as solicitações, ele pode confiar nos dados que você envia. Esse também é motivo pelo qual é importante que o segredo seja manipulado com segurança.

Cuidado

Qualquer pessoa com acesso ao segredo pode representar seu aplicativo ao se comunicar com o serviço do Azure Fluid Relay.

Tokens Web JSON e o serviço do Azure Fluid Relay

O Azure Fluid Relay usa tokens Web JSON (JWTs) para codificar e verificar dados assinados com sua chave secreta. Os Tokens Web JSON são um bit de sinal de JSON que pode incluir informações adicionais sobre direitos e permissões.

Observação

As especificidades do JWTs estão além do escopo deste artigo. Para obter mais informações sobre o padrão JWT, consulte Introdução aos Tokens Web JSON.

Embora os detalhes da autenticação sejam diferentes entre os serviços Fluid, diversos valores devem sempre estar presentes.

  • containerId O serviço Fluid precisa da ID do contêiner para identificar qual serviço corresponde ao contêiner de chamada. Note: o JWT chama esse campo de documentId, mas o serviço Fluid espera uma ID de contêiner nesse campo.
  • tenantId: o serviço do Azure Fluid Relay usa a ID de locatário para recuperar o segredo compartilhado que ele usará para autenticar sua solicitação.
  • scopes: os escopos definem as permissões do contêiner de chamada. O conteúdo do campo de escopos é flexível, permitindo que você crie suas próprias permissões personalizadas.
{
  "alg": "HS256",
  "typ": "JWT"
}.{
  "documentId": "azureFluidDocumentId",
  "scopes": [ "doc:read", "doc:write", "summary:write" ],
  "user": {
    "name": "TestUser",
    "id": "Test-Id-123"
  },
  "iat": 1599098963,
  "exp": 1599098963,
  "tenantId": "AzureFluidTenantId",
  "ver": "1.0"
}.[Signature]

O modo do usuário indica se a conexão está no modo de leitura ou leitura/gravação. Isso pode ser exibido no campo connections em AzureAudience. As permissões do escopo do token podem ser atualizadas na Função do Azure sem servidor na função generateToken.

const token = generateToken(
  tenantId,
  documentId,
  key,
  scopes ?? [ "Token Scope" ],
  user
);

Os escopos de token junto com os modos e o comportamento do contêiner são os seguintes:

Escopo do token Comportamento Meu Documento Comportamento Documento Público
DocRead Ler e gravar no documento. As alterações feitas no documento não são refletidas em nenhum outro documento público.
Modo: Leitura
Leitura e gravação no documento. As alterações não são refletidas em nenhum outro documento público.
Modo: Gravação
DocWrite Ler e gravar no documento. As alterações são refletidas em todos os outros documentos públicos.
Modo: Gravação
Ler e gravar no documento. As alterações são refletidas em todos os outros documentos públicos.
Modo: Gravação
DocRead, DocWrite Ler e gravar no documento. As alterações são refletidas em todos os outros documentos públicos.
Modo: Gravação
Ler e gravar no documento. As alterações são refletidas em todos os outros documentos públicos.
Modo: Gravação

Observação

Observe que o token também inclui informações do usuário (consulte as linhas 7 a 9 acima). Você pode usar isso para aumentar as informações do usuário que estão automaticamente disponíveis para o código Fluid usando o recurso de público. Consulte Adicionando dados personalizados a tokens para obter mais informações.

O provedor de token

Cada solicitação para o Azure Fluid Relay deve ser assinada com um JWT válido. O Fluid delega a responsabilidade de criar e assinar esses tokens para provedores de token.

Um provedor de token é responsável por criar e assinar tokens que o @fluidframework/azure-client usa para fazer solicitações ao serviço do Azure Fluid Relay. Você deve fornecer sua própria implementação de provedor de token seguro. No entanto, o Fluid fornece um InsecureTokenProvider que aceita seu segredo de locatário, e, então, gera localmente e retorna um token assinado. Esse provedor de token é útil para teste, mas não pode ser usado em cenários de produção.

Um provedor de token seguro sem servidor

Uma opção para criar um provedor de token seguro é criar uma função do Azure sem servidor e expô-la como um provedor de token. Isso permite que você armazene a chave secreta do locatário em um servidor seguro. Em seguida, seu aplicativo chamaria a função do Azure para gerar tokens em vez de assiná-los localmente, como faz o InsecureTokenProvider. Para obter mais informações, confira Como gravar um TokenProvider com uma função do Azure.

Conectando a autenticação do usuário à autenticação do serviço Fluid

Os serviços Fluid autenticam chamadas de entrada usando um segredo compartilhado do cliente que não esteja vinculado a um usuário específico. A autenticação do usuário pode ser adicionada com base nos detalhes do seu serviço Fluid.

Uma opção simples para a autenticação do usuário seria simplesmente usar uma função do Azure como seu provedor de token e impor a autenticação do usuário como uma condição de obtenção de um token. Se um aplicativo tentar chamar a função, ele falhará, a menos que seja autenticado com o sistema de autenticação. Se você estiver usando o Microsoft Entra ID, por exemplo, poderá criar um aplicativo do Microsoft Entra para sua função do Azure e associá-lo ao sistema de autenticação da sua organização.

Nesse caso, o usuário entraria em seu aplicativo usando o Microsoft Entra ID, por meio do qual você obteria um token para usar para chamar sua função do Azure. A própria função do Azure se comporta da mesma forma, mas agora está acessível somente para pessoas que também se autenticaram com o Microsoft Entra ID.

Como a função do Azure agora é seu ponto de entrada para obter um token válido, somente os usuários que se autenticaram corretamente para a função serão capazes de fornecer esse token para o serviço do Azure Fluid Relay a partir de seus aplicativos cliente. Essa abordagem em duas etapas permite que você use seu próprio processo de autenticação personalizado em conjunto com o serviço do Azure Fluid Relay.

Confira também