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 aos endpoints com base no usuário do ERP Datasul.
02. Conceitos Aplicados
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.
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=password
onde 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. Exemplos de Utilização
Autenticação
Para utilizar o modelo de autenticação com o Resource Owner Password Credentials, foi desenvolvido um endpoint que retorna dados para futuras utilizações:
Image Modified
Método: POST
URL: http://{{host}}:{{port}}/totvs-login-oauth2/oauth2/token?grant_type=password
Authorization: Basic Auth (Obrigatório)
Método de autenticação EMS: Informar o usuário e senha do produto (usuário tipo Interno)
Método de autenticação LDAP: Informar o usuário (dominio\usuário) e senha de rede (usuário do tipo Externo)
Aviso | ||
---|---|---|
| ||
O endpoint de autenticação permite o envio das credenciais por parâmetros, porém segundo a RFC6749 esta forma de envio não é recomendada e deve ser limitada somente a clientes incapazes de utilizar o esquema de autenticação HTTP Basic. https://datatracker.ietf.org/doc/html/rfc6749#section-2.3.1 Caso seja realmente necessário o envio por parâmetros, os mesmos só podem ser transmitidos no corpo da solicitação com o tipo: Content-Type: application/x-www-form-urlencoded |
Body:
- companyId (Opcional): Enviar como x-www-form-urlencoded, o código da empresa para direcionar a conexãoo broker que conecta com o PASOE.
Params:
- scope (Opcional): Há Para aumentar a segurança, existe a possibilidade de restringir o acesso do token de acordo com a URL do endpoint, sendo necessário enviar o parâmetro scope para receber o token com este parâmetro.
- Caso não for enviado, o resultado do scope sempre será "*"
Caso a autenticação seja realizada com sucesso, é retornado o token com o formato abaixo:
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
{
"access_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJiZDZlNmU2ZC1hNjVhLTFlYmYtNDYxNC1mOTYyOGMxM2M3YjUiLCJpYXQiOjE3MzM5MjE4MjcsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiMjc1NWFjMmEtN2RiZS00OTE3LWJiOTctZTkxYjY4OWVlZGQyIiwiZXhwIjoxNzMzOTIzNjI3LCJhdWQiOiJsb2NhbGhvc3QuODA4MCIsImNvbXBhbnlJZCI6ImY3N2Q4ZjM2LTQzYzYtOWJiMS05NzE0LWQyMTBhOGI1MzcwYSIsInNjb3BlIjpbIioiXX0.QjrEO6f64SfWZQhcnt0XPrXdGVAy7DnJpxJQmAnwnQWjYGFzwf3wIfaT58DIDsyK6oLV8KQVw6WvGEzJ2rkOcVXblft7f-oPek-hO8sWWaNiljHFulQ8ABZ_wAjHDzi2cNVNxiFYuUp7r2YUe_9sSlg9HRZoyckZumI3nUZYVnfpNMOD6-R7S0y8918LJ9XHwjQly0M2BjgCX4Ul3VAA9ICLACo3pljVJc5BTXVdX--Krt13aqcKoHCPceWqoX5RDJR5k2hFU_9C9k7CsJOiqb6HlATgur1n1WJSfsFC283P3P40OMoo5LVPVNDsh_WsVoZPgyv7k6FIHL00nJHizA",
"token_type": "Bearer",
"expires_in": 1800,
"refresh_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJiZDZlNmU2ZC1hNjVhLTFlYmYtNDYxNC1mOTYyOGMxM2M3YjUiLCJpYXQiOjE3MzM5MjE4MjgsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiNmQyZWFlMTgtODJiYy00NjE3LWJiZTItY2IwYjI3NzgwMTRjIiwiYWNjZXNzVG9rZW4iOiIyNzU1YWMyYS03ZGJlLTQ5MTctYmI5Ny1lOTFiNjg5ZWVkZDIiLCJleHAiOjE3MzM5MjM2Mjh9.cvL_swUdprVDv7EYZ0IQI7z0ErVEXw0SUDhjAbkBMVYULZLDHjto4YMn4HS3eGPAh5TMI5xHCzTAnYPYnhAN6OBPdR7wvWhlEJMIQFDpZXcI0cBUmLQLad0bBCJ2sND84Z1-wEa-c0dL35AwuIMeEoL3Xdqu55RiMkeoA8J3zJ54yeO7pH1IlXp89KKs8-hB39s5xao2FTjbc1aYYskoJ5yJnc-pj8W9O1H_VMcuFitfRsvizG3kD0GFyAeXst9_6V4GMQCSOW99xRKQJJlpfFCbR1GyrrJl4J112Wy_M5BTxG2vkBShHr3Ee2sSGFnHdin5WkBiFEOqGIwNjIYVMQ",
"scope": "*"
} |
- Se for necessário enviar mais de um scope, o valor deve ser enviado com separações por vírgula, conforme abaixo:
Image Modified
Caso enviado, é retornado o token conforme exemplo abaixo:
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "access_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjMjAzZjY2OS0yMTIzLTgyYWYtNDExNC05MDg5NzAxYTUxMTAiLCJpYXQiOjE3MTI2OTM4NjQsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiNmJmYzI2N2QtOWJjYS00ZjkxLWE0YzYtMWJlZmVmYjc5ZDYzIiwiZXhwIjoxNzEyNzAzODYzLCJhdWQiOiJKVk4wNjAxMDU2MzE6ODA4NiIsImNvbXBhbnlJZCI6ImEzNTQwYzliLTJjZTMtODE5OS1iMzE0LWJkMDE4MDc2MDhmMyIsInNjb3BlIjpbIi9hcGkiLCIvYXBpL2R0cyIsIi90b3R2cy1sb2dpbiJdfQ.MHmnHNBL3VGrJXBRsf1ip6m74QK6eVfpCX5_jgO8Zp1wbrS_MKQms3n0KQdx-AGJToDwOWC5kMFIqWy8Wkog_N_PBdf603zeg_NmqCyj9JSNw_SLFuqOClLXQdUwIVUr-hf5jslcPKbZxyn_Xfb1RgbIR-wh_2xABdoIduWqohPjzRSB3O5WCdtHmURIMakGYeKqIT1F7LOGAvF2xUdT8ODDsu0MzjTjexz1dwO95YCnWsgcpbGrXXc8l_pETQbCF7S3C5nPsscoNRmd8PjMo9tIjyiEbuR8Pi-xHWZF8hOMbjuexm3_rl2CLRTWAwJurOmINwc2ooRqK3Cjp8v0sQ", "token_type": "Bearer", "expires_in": 120, "refresh_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjMjAzZjY2OS0yMTIzLTgyYWYtNDExNC05MDg5NzAxYTUxMTAiLCJpYXQiOjE3MTI2OTM4NjUsImlzc3VlciI6ImRhdGFzdWwiLCJqdGkiOiI5ZjZkMjZkNS0wZjliLTQ0YmMtYmViZC01MGE5ZDBlYTg3ZDYiLCJhY2Nlc3NUb2tlbiI6IjZiZmMyNjdkLTliY2EtNGY5MS1hNGM2LTFiZWZlZmI3OWQ2MyIsImV4cCI6MTcxMjcwMzg2NH0.f-R_TVj9qFLNnIUvj8yKh9NH0o1aYDXmyHAMr-MjuUU5Fj7XC3IlmCuKXGT46_5zsydQfWUsjfn9ngkip8Vf70pz6utwANFd-MUqOla1toDETtxPQ0nLbHhL_sqx-scfM6-vcz4VufCgAwabR6bTUn7oL0LMv4twNeKHUpXcHjcjjfpMik4E1o_Cbw0lbtqtAyM52uih_OttrIolZAHgmQLubukJa7WHZsehU0kLiaqZsIfgOM7v2F5nTz5AfbbwrlRp4loWcoVSD2B5GdNzlZwhgdRQUq17RZvpR3Ew-8f4MXwlxWglR7MQZGylZAsbLt-rfBs8_nBbakRbX4rPLQ", "scope": "/api /api/dts /totvs-login" } |
Caso o parâmetro scope não for enviado, é retornado o token conforme exemplo abaixo, com o valor de scope igual a "*":
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
{ "access_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjMjAzZjY2OS0yMTIzLTgyYWYtNDExNC05MDg5NzAxYTUxMTAiLCJpYXQiOjE3MTI2OTM4NjQsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiNmJmYzI2N2QtOWJjYS00ZjkxLWE0YzYtMWJlZmVmYjc5ZDYzIiwiZXhwIjoxNzEyNzAzODYzLCJhdWQiOiJKVk4wNjAxMDU2MzE6ODA4NiIsImNvbXBhbnlJZCI6ImEzNTQwYzliLTJjZTMtODE5OS1iMzE0LWJkMDE4MDc2MDhmMyIsInNjb3BlIjpbIi9hcGkiLCIvYXBpL2R0cyIsIi90b3R2cy1sb2dpbiJdfQ.MHmnHNBL3VGrJXBRsf1ip6m74QK6eVfpCX5_jgO8Zp1wbrS_MKQms3n0KQdx-AGJToDwOWC5kMFIqWy8Wkog_N_PBdf603zeg_NmqCyj9JSNw_SLFuqOClLXQdUwIVUr-hf5jslcPKbZxyn_Xfb1RgbIR-wh_2xABdoIduWqohPjzRSB3O5WCdtHmURIMakGYeKqIT1F7LOGAvF2xUdT8ODDsu0MzjTjexz1dwO95YCnWsgcpbGrXXc8l_pETQbCF7S3C5nPsscoNRmd8PjMo9tIjyiEbuR8Pi-xHWZF8hOMbjuexm3_rl2CLRTWAwJurOmINwc2ooRqK3Cjp8v0sQ", "token_type": "Bearer", "expires_in": 120, "refresh_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJjMjAzZjY2OS0yMTIzLTgyYWYtNDExNC05MDg5NzAxYTUxMTAiLCJpYXQiOjE3MTI2OTM4NjUsImlzc3VlciI6ImRhdGFzdWwiLCJqdGkiOiI5ZjZkMjZkNS0wZjliLTQ0YmMtYmViZC01MGE5ZDBlYTg3ZDYiLCJhY2Nlc3NUb2tlbiI6IjZiZmMyNjdkLTliY2EtNGY5MS1hNGM2LTFiZWZlZmI3OWQ2MyIsImV4cCI6MTcxMjcwMzg2NH0.f-R_TVj9qFLNnIUvj8yKh9NH0o1aYDXmyHAMr-MjuUU5Fj7XC3IlmCuKXGT46_5zsydQfWUsjfn9ngkip8Vf70pz6utwANFd-MUqOla1toDETtxPQ0nLbHhL_sqx-scfM6-vcz4VufCgAwabR6bTUn7oL0LMv4twNeKHUpXcHjcjjfpMik4E1o_Cbw0lbtqtAyM52uih_OttrIolZAHgmQLubukJa7WHZsehU0kLiaqZsIfgOM7v2F5nTz5AfbbwrlRp4loWcoVSD2B5GdNzlZwhgdRQUq17RZvpR3Ew-8f4MXwlxWglR7MQZGylZAsbLt-rfBs8_nBbakRbX4rPLQ", "scope": "*" } | ||||||
Informações | ||||||
title | Informação||||||
A partir da versão 12.1.2311, é retornado o refresh_token como parâmetro para que o token de acesso possa ser regerado sem a necessidade de efetuar uma nova autenticação.
|
Autorização
De posse com o token JWT gerado na etapa anterior, para acessar determinados recursos / endpointendpoints, bastaria enviar o token de acesso ("access_token) na " na requisição como Bearer na header Authorization.
Exemplo...:
Método: GET
URL: http://{{host}}:{{port}}/api/btb/v1/properties/general
Authorization: Bearer (Informar o access_token)
Image Added
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:
|