Emitir tokens JSON Web

Neste documento, explicamos como emitir JSON Web Tokens como parte da ativação do acesso de apps baseados na Web e em dispositivos móveis aos dados do Fleet Engine. Se ainda não fez isso, leia JSON Web Tokens na seção Segurança no Fleet Engine. Com o serviço Fleet Engine, é possível emitir JWTs de uma das seguintes maneiras:

  • Use a biblioteca de autorização. O Google recomenda que você use essa abordagem quando sua base de código estiver escrita em Java. Essa biblioteca processa a emissão de JWTs para todos os cenários de uso que você possa precisar com o serviço e simplifica muito a implementação.
  • Crie seus próprios JWTs. Se você não puder usar nossa biblioteca JWT, você precisará criá-la em sua própria base de código. Esta seção fornece os vários exemplos de JWTs para cada cenário.

Como os JWTs funcionam

Para ambientes não confiáveis, como smartphones e navegadores da Web, o servidor de back-end emite JWTs que funcionam da seguinte maneira:

  • O código do cliente em execução em um ambiente de baixa confiança chama o código do servidor em execução em um ambiente totalmente confiável para solicitar que o JWT apropriado seja transmitido ao Fleet Engine.

  • Os JWTs são associados a contas de serviço. Portanto, as solicitações enviadas ao Fleet Engine são associadas implicitamente à conta de serviço que assinou o JWT.

  • As declarações do JWT restringem ainda mais os recursos em que o cliente pode operar, como veículos, viagens ou tarefas específicos.

Usar a biblioteca de autorização para Java

Para usar a biblioteca de autorização do Fleet Engine para Java, acesse o repositório do GitHub. A biblioteca simplifica a construção de JWTs do Fleet Engine e os assina com segurança. Ele oferece o seguinte:

  • Declarações de dependência do projeto
  • Uma lista completa de todos os papéis da conta de serviço para viagens sob demanda ou tarefas programadas
  • Mecanismos de assinatura de token que não usem arquivos de credenciais, como a representação de uma conta de serviço
  • Anexa tokens assinados a solicitações de saída feitas em um stub do gRPC ou uma biblioteca de cliente do Google API Codegen (GAPIC).
  • Instruções sobre como integrar os signatários às bibliotecas de cliente do Fleet Engine

Se você emitir JWTs do código

Se não for possível usar a biblioteca de autorização para Java, implemente JWTs na sua própria base de código. Esta seção apresenta algumas diretrizes para criar seus próprios tokens. Consulte JSON Web Tokens na seção Segurança no Fleet Engine para conferir uma lista de campos e declarações de JWT. Consulte Papéis de contas de serviço para saber quais são os papéis de conta de serviço usados pelo Fleet Engine. Consulte a seção a seguir para ver uma lista de exemplos de JWT para viagens sob demanda ou tarefas programadas.

Diretrizes gerais

  • Use contas e papéis de serviço apropriados. A conta de serviço e o papel associado garantem que o usuário que solicita o token tenha autorização para visualizar as informações que o token pode acessar. Especificamente:
    • Se você assinar um JWT para ser transmitido a um dispositivo móvel, use a conta de serviço para a função de SDK do motorista ou do consumidor. Caso contrário, o dispositivo móvel poderá alterar e acessar dados a que não deveria ter acesso.
    • Se assinar o JWT que será usado para chamadas privilegiadas, use a conta de serviço com o papel de administrador correto do Fleet Engine ao usar o ADC ou JWTs. Caso contrário, a operação falhará.
  • Compartilhe apenas os tokens criados. Nunca compartilhe as credenciais usadas para criar os tokens.
  • Para chamadas gRPC, o mecanismo para anexar o token depende da linguagem e do framework usados para fazer a chamada. O mecanismo para especificar um token para uma chamada HTTP é incluir um cabeçalho Authorization com um token do portador cujo valor seja o token.
  • Retorna um prazo de validade. Seu servidor precisa retornar um tempo de expiração para o token, normalmente em segundos.
  • Se você precisar criar e assinar um JSON diretamente como um portador de token, em vez de usar tokens de acesso do OAuth 2.0, leia as instruções sobre Autorização da conta de serviço sem OAuth na documentação do desenvolvedor do Identity.

Para viagens sob demanda

  • Ao criar o payload do JWT, adicione uma declaração adicional na seção de autorização com a chave vehicleid ou tripid definida como o valor do ID do veículo ou da viagem para a qual a chamada está sendo feita.

Para tarefas agendadas

  • Quando o servidor chama outras APIs, os tokens também precisam conter a declaração adequada. Para isso, faça o seguinte:
    • Defina o valor de cada chave como *.
    • Conceda ao usuário acesso a todos os taskids e deliveryvehicleids. Para fazer isso, adicione uma declaração extra na seção de autorização com as chaves taskid e deliveryvehicleid.
    • Ao usar o asterisco (*) na declaração taskids, ele precisa ser o único elemento na matriz.

Exemplos de JWT para viagens sob demanda

Esta seção apresenta exemplos de JWT para cenários comuns se você usa viagens sob demanda.

Exemplo de token para uma operação de app do motorista

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_driver_service_account"
}
.
{
  "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
  "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "vehicleid": "driver_12345"
   }
}

Exemplo de token para uma operação de aplicativo do consumidor

{
  "alg": "RS256",
  "typ": "JWT",
  "kid": "private_key_id_of_consumer_service_account"
}
.
{
  "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
  "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
  "aud": "https://fleetengine.googleapis.com/",
  "iat": 1511900000,
  "exp": 1511903600,
  "authorization": {
     "tripid": "trip_54321"
   }
}

Exemplos de JWT para tarefas programadas

Esta seção fornece um exemplo de JWT para cenários típicos se você usa tarefas programadas.

Exemplo de token para um app de motorista

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_driver_service_account"
    }
    .
    {
      "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
      "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "driver_12345"
       }
    }

Exemplo de token para um app do consumidor

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_consumer_service_account"
    }
    .
    {
      "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "trackingid": "shipment_12345"
       }
    }

Exemplos de JWT para operações de frota

Nesta seção, apresentamos um exemplo de JWT para um cenário típico de operações de frota.

Token de exemplo para rastrear todas as tarefas e veículos em uma frota

O exemplo a seguir é um token que rastreia todas as tarefas e veículos na frota de um app baseado na Web usado por um operador. As permissões necessárias para essas operações são maiores do que para aplicativos clientes. Consulte Configurar a biblioteca JavaScript Fleet Tracking para conferir a implementação do lado do cliente que usaria esse token:

  • Assine o token usando o papel Fleet Engine Delivery Fleet Reader do Cloud IAM.

   {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_consumer_service_account"
    }
    .
    {
      "iss": "superuser@yourgcpproject.iam.gserviceaccount.com",
      "sub": "superuser@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "scope": "https://www.googleapis.com/auth/xapi",
      "authorization": {
         "taskid": "*",
         "deliveryvehicleid": "*",
       }
    }

Método de autenticação alternativo para operações do servidor de back-end

O Google recomenda que você use o ADC para autenticar operações do servidor de back-end. Se não for possível usar o ADC e for necessário usar JWTs, consulte estes exemplos.

Exemplo de token para uma operação de servidor de back-end sob demanda

  {
    "alg": "RS256",
    "typ": "JWT",
    "kid": "private_key_id_of_provider_service_account"
  }

  {
    "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
    "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
    "aud": "https://fleetengine.googleapis.com/",
    "iat": 1511900000,
    "exp": 1511903600,
    "authorization": {
       "vehicleid": "*",
       "tripid": "*"
     }
  }
  

Exemplo de token para uma operação programada do servidor de back-end

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskid": "*"
       }
    }
   

Exemplo de token para uma operação de criação de tarefas em lote de servidor de back-end programada

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskids": ["*"]
       }
    }
  

Exemplo de token para um servidor de back-end programado por operação de veículo de entrega

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "*"
       }
    }
  

A seguir