Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

CONTEÚDO

Informações

Índice
maxLevel4
minLevel2
indent50px
absoluteUrltrue

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:



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

AuthorizationBasic 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
titleAviso

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): 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
languageruby
titleExemplo do retorno Body
linenumberstrue
{
    "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": "*"
}
Caso exista mais de um valor dentro de scope, deverá ser enviado com uma separação
    • 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
languageruby
titleExemplo do retorno Body
linenumberstrue
{
    "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 "*":

Informação
Bloco de código
languageruby
titleExemplo do retorno Body
linenumberstrue
{
    "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

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.

Bloco de código
languageruby
{
    "access_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJmMDkzNTQwOC1hZThjLTBlYWUtYWExNC03MzA2OGM3ZjQwZTAiLCJpYXQiOjE2OTI2NDczMTAsImlzc3VlciI6ImRhdGFzdWwiLCJpc3MiOiJkYXRhc3VsIiwianRpIjoiYTk1YTAzNmMtNjA1OS00YmZhLWJlNTYtYmUxZDk5NGNlM2I4IiwiZXhwIjoxNjkyNjQ3NDkwLCJhdWQiOiJ0ZXN0ZSIsInRlbmFudElkIjoiZjc3ZDhmMzYtNDNjNi05YmIxLTk3MTQtZDIxMGE4YjUzNzBhIiwic2NvcGUiOlsiKiJdfQ.grdplhwM5Q1B2F1G_JYq4UEaY7yHNhp7N60cr1YZwM4Z5qjpT0fqoKALZYnQqKH-YcboCcVrjZ5VFVdOgcMXu6s5w8cKEumLlDEidip67rncAOEyZPZ3tcA053QszaKuhDxBDrOwpmS9xRW6AV7oVGFBDQN2fDZDBl7uUin4Qv5hMXGZvxWtIYoha3pvMGviyupYae9GKA71ZZwvBIDpScbXIhkuroM03MsrdHwypzFYbLrPAmmTITEl_b-Y6v4MekbcE01SfSRrQuXU7tS4pxC3dXyysi_dWUeAFAw8Xdxv4VoNVKkFO2pnmQwGXSOGunES7bbd24DCnFGW0RZa7A",
    "token_type": "Bearer",
    "expires_in": 180,
    "refresh_token": "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJmMDkzNTQwOC1hZThjLTBlYWUtYWExNC03MzA2OGM3ZjQwZTAiLCJpYXQiOjE2OTI2NDczMTAsImlzc3VlciI6ImRhdGFzdWwiLCJqdGkiOiJhY2RjOWFlNC03MTRmLTRiMTYtYTdiYS00ODk1MjM2YjI2YTgiLCJhY2Nlc3NUb2tlbiI6ImE5NWEwMzZjLTYwNTktNGJmYS1iZTU2LWJlMWQ5OTRjZTNiOCIsImV4cCI6MTY5MjY0NzQ5MH0.QDtj1txFGd29humF_d6BmiC2f9ppoUXmFnpWDCuzIZn_VzV6EdMOQxv-rM0OujOuss-Z17HhcppL34wqtu_KWK6dupKr3E35cAkV7zcRfkgduBWyPFXSS4LCKIW5RXRoE8VucaDf0rwF1lcl6I3ZPdqzB8D3okDNirW7h1GO6G5TnWz0bHjdE-ZVFjW8x0JvLJE88TmObgLFaF7zLQTYZQ4VXRik_DueCw9dkBWNYJbr57C0wlYpVF7ZujESeX93IjNjzkw1CfDmLySaFGNCksc5VlRLt4NtoSFfFRhPStK7mmFRYveRu1PkF214xCnsSdK2ftqe4QfnqxsU8KAK8g",
    "scope": "*"
}



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
titleDica

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:

  • 200 (OK): Acesso permitido ao recurso com os dados retornados;
  • 401 (Unauthorized): O token informado não é valido;
  • 403 (Forbidden): O token é valido porém há restrição em seu uso (escopo ou audiência);
  • 500 (Internal Server Error): Ocorreu um erro no servidor de aplicação Web (Tomcat) ou AppServer.