DEV-001 - Gerando JWT Da Unico Para Chamadas

ID: KB-DEV-001

Responsável: Thiago Amaral, TI

Status: Publicado

Última Atualização: 07/08/2025


Propósito

Instruir a emissão do token JWT para a realização de chamadas REST API na Unico.

Aplica-se a

  • Unico.

Pré-requisitos

  • Chave privada e pública do nosso ambiente na Unico.

  • Curl ou Postman para as requisições.


Instruções

1. Criando Usuário De Serviço

  1. Solicite para o gerente de projetos responsável pela empresa enviando: nome da empresa, noma da aplicação, nome, e-mail e celular do responsável pela aplicação na empresa.

    1. Dados da conta atual.

      Conta:
      idcloud
      ID da chave:
      92d795d8-dee0-4fb8-a21b-b99a5d358ca7
      ID do tenant:
      06051cdc-9b1a-47a7-b66c-5bec93ae666e
      

2. Criando O JWT

  1. Defina oheader.

    {
    	"alg":"typ"
    	"RS256",
    	"JWT"
    }
    
  2. Defina opayload.

    {
    	"iss": "92d795d8-dee0-4fb8-a21b-b99a5d358ca7@06051cdc-9b1a-47a7-b66c-5b
    	ec93ae666e.iam.acesso.io",
    	"aud": "<https://identityhomolog.acesso.io>",
    	"scope": "*",
    }
    
  3. Baixe a chave privada e pública enviada na criação da conta de serviço, ela virá no modelo account-name_account-id .

  4. Com esses dados, utilize um script para a criação dos outros valores dinâmicos e assinatura em Base64 do header e payload juntos. Abaixo haverá um exemplo prático utilizandoBash script.

    #!/usr/bin/env bash
    
    # ==============================================================================
    # SCRIPT COMPLETO PARA OBTER ACCESS TOKEN E FAZER UMA REQUISIÇÃO À API UNICO
    # Versão final com todas as correções aplicadas.
    # ==============================================================================
    
    # --- CONFIGURAÇÃO ---
    
    # Nome do arquivo da sua chave privada.
    PRIVATE_KEY_FILE="idcloud_92d795d8-dee0-4fb8-a21b-b99a5d358ca7.key.pem"
    
    # O 'issuer' da sua conta de serviço.
    # CORRIGIDO: Usando o nome da conta "idcloud" conforme a documentação.
    SERVICE_ACCOUNT_ISS="[email protected]"
    
    # O 'audience' e a URL da API de autenticação de PRODUÇÃO.
    AUTH_URL_BASE="<https://identity.acesso.io>"
    
    # O ID do processo que você quer consultar (exemplo).
    PROCESS_ID="bf3ce6d3-37c0-43be-9384-7059b05c7993"
    
    # --- LÓGICA DO SCRIPT ---
    
    echo "PASSO 0: Verificando pré-requisitos..."
    if [ ! -f "$PRIVATE_KEY_FILE" ]; then
      echo "ERRO: Arquivo de chave privada '$PRIVATE_KEY_FILE' não encontrado."
      exit 1
    fi
    echo "OK: Chave privada encontrada."
    echo "--------------------------------------------------------"
    
    # Função para codificar em Base64URL
    base64url_encode() {
        base64 -w 0 | tr -d '=' | tr '/+' '_-'
    }
    
    # 1. Gerar o JWT (JSON Web Token)
    echo "PASSO 1: Gerando o JWT..."
    header_json='{"alg":"RS256","typ":"JWT"}'
    iat=$(date +%s)
    exp=$((iat + 3600)) # 1 hora de validade
    
    # CORRIGIDO: Usando 'jq -c' para garantir JSON compacto (sem espaços/quebras de linha)
    payload_json=$(jq -c -n \\
                      --arg iss "$SERVICE_ACCOUNT_ISS" \\
                      --arg aud "$AUTH_URL_BASE" \\
                      --arg iat "$iat" \\
                      --argjson exp "$exp" \\
                      '{iss: $iss, aud: $aud, scope: "*", iat: ($iat | tonumber), exp: $exp}')
    
    b64_header=$(echo -n "$header_json" | base64url_encode)
    b64_payload=$(echo -n "$payload_json" | base64url_encode)
    unsigned_token="$b64_header.$b64_payload"
    signature=$(echo -n "$unsigned_token" | openssl dgst -sha256 -sign "$PRIVATE_KEY_FILE" | base64url_encode)
    JWT="$unsigned_token.$signature"
    echo "OK: JWT gerado com sucesso."
    echo "--------------------------------------------------------"
    
    # 2. Trocar o JWT por um AccessToken
    echo "PASSO 2: Solicitando o AccessToken..."
    AUTH_URL_TOKEN="$AUTH_URL_BASE/oauth2/token"
    
    # CORRIGIDO: Script restaurado para modo funcional (não mais em debug)
    ACCESS_TOKEN=$(curl --silent --location --request POST "$AUTH_URL_TOKEN" \\
    --header 'Content-Type: application/x-www-form-urlencoded' \\
    --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer' \\
    --data-urlencode "assertion=$JWT" | jq -r .access_token)
    
    # Verifica se o AccessToken foi obtido com sucesso
    if [ "$ACCESS_TOKEN" = "null" ] || [ -z "$ACCESS_TOKEN" ]; then
        echo "ERRO: Falha ao obter o AccessToken. Verifique as credenciais e a resposta do servidor."
        # Opcional: Descomente a linha abaixo para ver a resposta de erro completa do servidor
        # curl --location --request POST "$AUTH_URL_TOKEN" --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer' --data-urlencode "assertion=$JWT"
        exit 1
    fi
    echo "OK: AccessToken recebido com sucesso."
    echo "--------------------------------------------------------"
    
    # 3. Fazer a requisição final à API desejada
    echo "PASSO 3: Executando a requisição final para o Process ID: $PROCESS_ID"
    API_URL="<https://api.cadastro.unico.app/client/v1/process/$PROCESS_ID>"
    
    curl --location "$API_URL" \\
    --header "Authorization: Bearer $ACCESS_TOKEN" \\
    --header 'Content-Type: application/json'
    
    echo # Adiciona uma nova linha no final para melhor formatação
    

Resultado Esperado

Utilizando o process ID desejado, é possível obter informações sobre uma assinatura emJSON.

Solução de Problemas

N/A

Artigos Relacionados

N/A

Anexos

N/A

Referências

  • https://devcenter.unico.io/idcloud/integracao/autenticacao/criando-uma-conta-de-servico

    Seção para realização de uma conta de serviço na Unico IDCloud para autenticação.

Histórico de Revisões

Data

Versão

Autor

Descrição das Mudanças

07/08/2025

1.0

Thiago Amaral

Confeccção do documento.

Last updated