Versões comparadas
Chave
- Esta linha foi adicionada.
- Esta linha foi removida.
- A formatação mudou.
CONTEÚDO
| Informações | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
01. VISÃO GERAL
Disponibilizar um modelo de autenticação e autorização de acesso a recursos (endpoints), que permita abstração e flexibilidade com a utilização de um serviço de login independente (conforme modelo de arquitetura especificado na RFC000010 e RFC000015).
02. CONCEITOS APLICADOS
OAuth2 é um protocolo que permite aos usuários ter acesso limitado a determinados recursos sem precisar expor suas credenciais. Por isso, serão usados os fluxos de autenticação e autorização baseados no OAuth2.
COMO FUNCIONA
Ao entrar em uma empresa com controle de acesso, é necessário efetuar previamente o cadastro na portaria (autenticação).
De acordo com a sua visita, a portaria garantirá a autorização de acesso temporária e você receberá um crachá para entrar em determinadas portas
Alguns carros de luxo vem com uma chave extra chamada valet key.
Essa chave pode ser utilizada quando queremos que um manobrista estacione o carro.
Ao utilizar essa chave para ligar o carro, o manobrista não será capaz de dirigir o carro por mais de 2 km.
Independente da restrição que essa chave especial o crachá impõe a seus utilizadores, a ideia é clara: você dá a alguém acesso limitado ao seu carro utilizando uma chave especial e quando quiser acesso ilimitado ao carro, utiliza a chave normalas portas de acordo com a sua visita.
PARA QUE SERVE
Análogo a valet keyao crachá, para obter acesso limitado a recursos usando o OAuth2, utiliza-se um access token (token de acessoJWT), que permite usufruir recursos de terceiros de forma segura.
TIPOS DE CONCESSÃO DE ACESSO
A TOTVS utilizará no novo serviço de login um dos fluxos propostos pelo framework Oauth2, abaixo a sua especificidade:
- O Grant Type para autenticação , autorização e permissionamento entre serviços (M2M). O Client é previamente cadastrado e permissionado e o Resource Server Client Credentials ou Resource Owner Password Credentials);
- Autorização de acesso conforme validade do token de acesso informadodeclara por meio de seeds seus recursos.
TIPOS DE GARANTIA DE ACESSO
Para o ERP ficar dentro da especificação e ter o escopo adequado, a TOTVS seguirá a implementação de dois tipos de Grant:
a. Client Credentials
Esse tópico aborda a autorização entre serviços (M2M) onde o Client age em seu próprio nome Resource Server.

Figura 1 - Modelo de acesso com Client Credentials
Abaixo estão listados os componentes do desenho acima:
IDM: Solução que garante a autenticidade do Resource Owner
Oauth Provider: Solução que assume o papel de Oauth Provider e atua como Authorization Server, esse componente tem a responsabilidade de assinar o access_token com chave assimétrica. O Authorization Server consome uma fila de propagação "Role x ClientId" produzida pelo componente RBAC que persisti para possibilitar a geração do access_token auto-contido com as "Roles" do ClientId. O Authorization Server deve verificar a base para invalidação do clientId de modo que o mesmo ao tentar renovar o access_token utilizando seu refresh_token ou autorizar seja invalidado pelo Oauth Provider;
RBAC: Esse componente é responsável por gerir as permissões possibilitando termos uma relação de "Role x Grant". A responsabilidade de verificação desse componente é classificada como extremamente crítica. A solução permite que o RBAC tenha consistência eventual delegando a verificação de "Grant x ClientID" para uma camada na aplicação (Resource Server);
Resource Server (APP 2): A aplicação que hospeda o recurso tem a responsabilidade de enviar suas Grants para o RBAC via fila. Esse componente também deve consumir a fila de propagação de "Role x Grant" e gravar os dados recebidos para possibilitar a verificação de permissão das "Roles" que estarão auto-contidas no access_token. O Resource Server tem posse da chave pública para a verificação do access_token. Percebe-se que é necessário a construção de uma abstração para as aplicações;
Client (APP 1): O Client é o consumidor do recurso e assume o papel de Resource Owner quando o "grant_type" é client_credentials, com isso, o Client precisa das credenciais client_id e client_secret gerados no momento do registro no Oauth Provider. Assumindo que o Client é o próprio Resource Owner não há a necessidade de delegação de acesso.
b.Resource Owner Password Credentials
A proposta aborda a autorização entre usuário Resource Owner e Client. Nesse caso o Client assume o papel de Resource Server, com isso, ele hospeda os recursos.

Figura 2 - Modelo de acesso com Resource Owner Password Credentials
Abaixo estão listados os componentes do desenho acima:
Oauth Provider: O mesmo do modelo anterior;
DAC: Esse componente é responsável por gerir as permissões a nível "granular" possibilitando que um usuário possa conceder a permissão para outro usuário;
Resource Server (APP 2): O mesmo do modelo anterior
- Nesse caso o Resource Server também é o Client. O Client gerencia o access_token e o Resource Server faz a verificação com a chave pública;
Resource Owner: Nesse Grant Type o usuário é o responsável pelas ações no Resource Server, logo o mesmo pede uma autorização em seu nome;
- A requisição de autorização é denominada
grant_type=passwordonde o usuário passa suas credenciais para um Client do tipo confidencial. O Client por sua vez deve pedir uma autorização ao Oauth Provider e obter o access_token.
- A requisição de autorização é denominada
03. EXEMPLO DE UTILIZAÇÃO
a. Otimização das Libs do Datasul
Para efetuar melhorias contínuas na manutenção, inovações, expedição do produto e otimização na utilização de memória do servidor Web (Tomcat), são utilizados conceitos de lib centralizadas.
Expedir as libs de forma centralizadaSpike de validação do conceito de lib centralizada | |
| Spike de utilização do conceito de BOM (Maven) para compilação do produto | |
| Compilação Maven para Libs Centralizadas | Instruções de trabalho para a geração dos artefatos conforme este novo conceito |
b. Configuração baseada no OAuth2
A configuração dos dois tipos de Grant será na tela de Propriedades OAuth2 no produto TOTVS.
| Informações |
|---|
Para a implementação dos dois tipos de GRANT será utilizado o Spring Security. Com o uso do Spring Security para esse controle, ocorrerá a modificação do uso de libs dentro do produto Datasul. Atualmente as libs estão duplicadas por arquivos .war, o que gera dificuldade em expedições e manutenções. Essa modificação consiste em criar uma pasta de libs específica para o Datasul, contendo tudo que é necessário para o produto funcionar com o Tomcat. Para isso será alterado o arquivo catalina.properties, que buscará a nova pasta e modificará o console para gerar as libs conforme o POM Archive. Esse POM Archive contém a definição de todas as libs utilizadas pelo sistema e ficará armazenado no controle de libs do Maven. O serviço de login permitirá as autenticações que já existem atualmente no sistema: LDAP, IDENTITY, PRODUCT. Para o RFI não será utilizado este formato. |
As configurações para utilização dos conceitos de login conforme OAuth2 são realizadas nas telas de Propriedades, disponíveis no produto.
| CFG - OAuth2 | Configura os modelos (Grant Type) de autenticação do usuário propostos nesta documentação. |
| CFG - JWT | Configura o modelo do Token JWT que será gerado caso a autenticação seja realizada com sucesso. |
c. Client Credentials - Autenticação
A autenticação é necessária para obter o token JWT, para isto foi desenvolvido um endpoint que retorna dados para futuras utilizações:
Método: POST
URL: http://{{host}}:{{port}}/totvs-login-oauth2/oauth2/token?grant_type=client_credentials
Authorization: Basic Auth (Informar as credenciais Id cliente, Senha cliente parametrizadas em Propriedades → OAuth2)
Image Added
Caso a autenticação seja realizada com sucesso, é retornado o token com o formato abaixo:
| Bloco de código | ||||||
|---|---|---|---|---|---|---|
| ||||||
{
"access_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiIwMjAwMTBzOGgyZ2ZpOTBoQ1duUG9WQXhnOERnNTUiLCJpYXQiOjE2NTY1MjM5MzYsImV4cCI6MTY1NjUyNDA1NiwiYXVkIjoiand0LmlvLmFwYWNoZS5leHRlcm5vIiwic2NvcGUiOlsiL2J0YiJdfQ.ZEMaRafOnFyUDkN198y5g2OkJuKfoS_zLDCXvP98XJ7hR--WTXnaQlEvTLmYf_Zhs6qmZHzpslE1hYRzzJRqPkRcuJ1LY_rAjiQJ8Zgk_NnHfT5HaAS0ut8G6rtJYIS9W_6FAAqal5PZE_iNwUd5mlVUT7_9SpNlSzhb3eH0r2Fe-Wceb6pJIrCI0UA_9UCAwvbQrDadcJXJGWjSqgf2l_B3K1HossFnCnAXsVCXsqVxofld4n9wnFD8B_qhy9UNSxbEayUjpOrJYmq4v5WvVFBG2XMk516ojFR3bT-q2PV-sWOqr8XyV-Qb7-cvkGNes9_DHKKkmUo3B77DP--Bjg",
"token_type": "Bearer",
"expires_in": 120,
"scope": "/btb"
} |
| Nota | ||
|---|---|---|
| ||
Neste conceito não ocorre a revogação do token JWT (logout / invalidate), o controle é realizado de acordo com o tempo de expiração do próprio token que pode ser parametrizado na tela de Propriedades → JWT. |
d. Client Credentials - Autorização
De posse com o token JWT gerado na etapa anterior, para acessar determinados recursos / endpoint, bastaria enviar o token na requisição com o formato Bearer Token:
Exemplo...
Método: GET
URL: http://{{host}}:{{port}}/api/btb/v1/properties/general
Authorization: Bearer (Informar o token JWT)
| Dica | ||
|---|---|---|
| ||
Nesta etapa são realizados diversas validações de autorização ao recurso / endpoint, tais como a integridade do Token JWT, validade, escopo e audiência, onde todas as informações necessárias já estariam presentes no próprio token. Possíveis status de retorno:
|
Como utilizar o Spring Security para atender OAuth2 Client Credentials
- Analisar se é necessário descrever aqui sobre a utilização do Spring Security.
c. Client Credentials - Autenticação
ClientCredentials - Authorization Server - Engine autenticação
Implementar a Engine de autenticação do client_id e client_secret e retorno do Token JWT devidamente configurado conforme RFC6749 com a utilização do Spring Security:
Autenticação conforme cadastro dos Apps;
Retorno do token JWT válido para utilização posterior.
- Descrever o processo que foi efetuado para Client Autenticação.
d. Client Credentials - Autorização
ClientCredentials - Resource Server - Engine autorização acesso
Implementar a Engine de autorização de acesso conforme Token JWT gerado anteriormente na autenticação:
Autorização de acesso caso o token JWT esteja válido;
Acesso conforme escopo (scope) previamente definidos.
|
e. Resource Owner Password Credentials - Autenticação
e AutorizaçãoRO Password Credentials - Engine de Autenticação e autorização | Implementar a Engine de autenticação e autorização de acesso para o modelo Resource Owner Password Credentials:
|
- Descrever o processo que foi efetuado para RO Autenticação e Autorização.
f. Resource Owner Password Credentials - Autorização
| Dica | ||
|---|---|---|
| ||
Nesta etapa também são realizadas as mesmas validações das apresentadas anteriormente no modelo Client Credentials, com seus respectivos retornos de HTTP Status Code. |