Visão geral de SSO do OpenID Connect
O OpenID Connect (OIDC) é um protocolo de autenticação com base no OAuth 2.0 que foi adotado por grandes empresas de tecnologia.
SSO básico
Sejam quais forem as opções de recursos selecionadas, os requisitos de configuração do SSO básico são os mesmos. Adicionar implementações de cartão de crédito ou programa de fidelidade exige mais informações.
Requisitos de configuração
Para configurar o acesso de SSO do OIDC ao seu modelo de site, alguns elementos são necessários, incluindo:
- APIs (autorizar, token, userProfile, JWKS)
- ClientId
- Segredo do cliente
- ResponseMode
- isNonceEnabled
- customerDetailsAPIKey (se disponível)
Fluxos de Autorização

Autorizar ponto final
O ponto de extremidade GET /authorize
é usado para autenticação e autorização. Ele retorna uma concessão de autorização ou código para o cliente, caso o usuário seja logged-in. É um redirecionamento do navegador.
Parâmetros de solicitação
Parâmetro | Descrição | Tipo de dados | Exemplo do valor | Obrigatório? |
---|---|---|---|---|
client_id | Identifica o cliente. Deve corresponder ao valor pré-registrado no seu provedor de identidade (IDP). Obtido durante o registro manual do cliente ou por meio da API de registro dinâmico do cliente. | Sequência | Sim | |
nonce | Usado para mitigar ataques de repetição. Esse valor é retornado no token de ID. | Sequência | Sim | |
prompt | O tipo de interação necessário para validação. Se "vazio", o usuário deverá efetuar login, caso ainda não esteja autenticado. Se "nenhum", o IDP não solicitará login, mas retornará um código de autorização se estiver conectado ou um erro caso contrário. | Sequência | Valores válidos: Nenhum OU vazio | Não |
redirect_uri | Local de callback para onde o código de autorização ou tokens devem ser enviados. Deve corresponder ao valor pré-registrado no seu IDP durante o registro do cliente. | Sequência | Sim | |
response_type | Valor do code (IDP). | Sequência | Sim | |
response_mode | Como a resposta de autorização deve ser retornada. | Sequência | Valor válido: query | Não |
scope | Token de acesso, usado para buscar detalhes de perfil. Obrigatório para solicitações de autenticação. | Sequência | OpenID, profile e email | Sim |
state | O estado da interação. Esse valor é retornado no token e permite que o usuário clique, faça a autenticação e retorne à página em que estava interessado. O valor pode conter caracteres alfanuméricos, vírgula, ponto, sublinhado e hífen. | Sequência | Sim | |
ui_locales | Idiomas e scripts preferidos do usuário para a interface do usuário. | Sequência | en_CA, fr_CA | Não |
audience | O destinatário pretendido. | Sequência | Definido por Parceiros | Não |
Parâmetros de resposta
Parâmetro | Descrição | Tipo de dados | Obrigatório? |
---|---|---|---|
code | Código de autorização que identifica o cliente. Deve corresponder ao valor pré-registrado no seu IDP. Obtido durante o registro manual do cliente ou por meio da API de registro dinâmico do cliente. | Sequência | Sim |
state | O estado da interação. Esse valor é retornado no token e permite que o usuário clique, faça a autenticação e retorne à página em que estava interessado. O valor pode conter caracteres alfanuméricos, vírgula, ponto, sublinhado e hífen. | Sequência | Sim |
URL de autorização de amostra
https://example.com/authorize?client_id={clientID}&response_type=code&state=d6b93799-404b-4205-9bb3-c579b1180428&scope=openid email profile&nounce=234567687867&redirect_uri=https://{ExpediaDomain}/sso/auth
URL de retorno de chamada de exemplo
https://{ExpediaDomain}/sso/auth?code=12345678&state=d6b93799-404b-4205-9bb3-c579b1180428
Ponto final do token
O ponto de extremidade POST /token
é uma chamada de API de backend que é usada para obter um token de acesso e um token de ID apresentando uma concessão de autorização ou código.
Parâmetros de solicitação
Parâmetro | Descrição | Tipo de dados | Obrigatório? |
---|---|---|---|
grant_type | O mecanismo que um IDP usa para autorizar a criação dos tokens. Valor: authorization_code. | Sequência | Sim |
redirect_uri | Especifica o local de callback para onde a autorização foi enviada. Esse valor deve corresponder ao redirect_uri usado para gerar o authorization_code original, senão o ponto de extremidade do token falha. | Sequência | Sim |
code | Código de identificação do cliente recebido na resposta da chamada de /authorize . | Sequência | Sim |
Cabeçalhos de solicitação
Campo | Descrição | Tipo de dados | Exemplo do valor | Obrigatório? |
---|---|---|---|---|
accept | Deve ser "application/json". | Sequência | application/json | Sim |
authorization | Codifica o ID e o segredo do cliente com Base64. Use as informações codificadas no cabeçalho de autorização HTTP. | Sequência | Basic<Base64 encoded client ID and secret> | Sim |
Content-Type | Deve ser "application/x-www-form-urlencoded". | Sequência | application/x-www-form-urlencoded | Sim |
Parâmetros de resposta
Campo | Descrição | Tipo de dados |
---|---|---|
access_token | Um token de acesso. | Sequência |
token_type | O público do token. | Sequência |
expires_in | O tempo de expiração do token de acesso em segundos. | Inteiro |
scope | Os escopos contidos no token de acesso. | Sequência |
id_token | Um identificador que é retornado se o escopo de OpenID for concedido. | Sequência |
ID_token
O ID_token é um JSON Web Token (JWT) que inclui partes de informações de autenticação chamadas de declarações. As soluções de modelo da Expedia usam as declarações header
, payload
e signature
, conforme a tabela a seguir.
Declarações de cabeçalho
Campo | Descrição | Tipo de dados | Obrigatório? |
---|---|---|---|
alg | Identifica o algoritmo de assinatura digital utilizado, que é sempre RS256. | Sequência | Não |
kid | ID da chave: identifica a chave pública usada para verificar o token de ID. A chave pública correspondente pode ser encontrada por meio do JSON Web Key Set (JWKS). | Sequência | Sim |
Declarações de conteúdo
Campo | Descrição | Tipo de dados | Obrigatório? |
---|---|---|---|
amr | Matriz JSON de sequências que são identificadores para métodos de autenticação. | Matriz | Não |
aud | Identifica o público ao qual o token de ID se destina, ou seja, um dos IDs de cliente do OAuth 2.0 do seu aplicativo. | Sequência | Sim |
auth_time | O tempo em que o usuário final foi autenticado, representado em hora Unix (segundos). | Inteiro | Não |
exp | O tempo em que o token de ID expira, representado em hora Unix (segundos). | Inteiro | Sim |
iat | O tempo em que o token de ID foi emitido, representado em hora Unix (segundos). | Inteiro | Não |
idp | Um indicador do provedor de identidade. | Sequência | Sim |
iss | A URL do servidor de autorização que emitiu o token de ID. | Sequência | Não |
jti | Um identificador exclusivo do token de ID para fins de depuração e revogação. | Sequência | Sim |
sub | Um identificador exclusivo do sujeito da chamada de autorização, ou seja, o usuário. | Sequência | Não |
ver | A versão semântica do token de ID. | Inteiro | Sim |
Declarações de assinatura
Validação da assinatura: A assinatura será validada em relação à chave apropriada (recuperada usando JWKS endpoint
) para aquele client_id
e algoritmo.
Token de amostra CURL
curl --location 'https://example.com/token’ \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic {encoded ClientID:clientSecret}' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'redirect_uri=https://{ExpediaDomain}/sso/auth’ \
--data-urlencode 'code={Authorization code after login as part of callback to Expedia /sso/auth endpoint}'
Resposta de token de amostra
{
"access_token": "eyJhbGciOi.JSUzI1NiIsImtpZCI6Ilk1MkFDVXd3QV9SUzI1NiIsInBp.LmF0bSI6ImlrY20ifQ",
"id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6.IllEQnJQdlllYlRwa1laODZoaGk1MkFDVX.d3QV9SUzI1NiJ9",
"token_type": "Bearer",
"expires_in": 1799
}
Ponto final do Userinfo
O ponto de extremidade GET /userinfo é uma chamada de API de backend que retorna declarações sobre o usuário autenticado com base no token de acesso fornecido.
Cabeçalhos de solicitação
Campo | Descrição | Tipo de dados | Exemplo do valor | Obrigatório? |
---|---|---|---|---|
ClientId | Identifica o cliente. Deve corresponder ao valor pré-registrado no seu provedor de identidade (IDP). Obtido durante o registro manual do cliente ou por meio da API de registro dinâmico do cliente. | Sequência | Sim | |
Authorization | Cabeçalho HTTP usado para enviar credenciais ou tokens para autenticar um usuário | Sequência | Portador [access_token] | Sim |
Resposta
Campo | Descrição | Tipo de dados | Exemplo do valor | Obrigatório? |
---|---|---|---|---|
membershipId | Identificador que identifica exclusivamente a conta do Cliente | Sequência | Sim | |
optIn | Sinalizador booleano se o cliente optar por receber e-mail de marketing | Booleano | verdadeiro/falso | Não |
languageId | Idioma preferido do usuário | Sequência | En, fr | Não |
channelType | Diferentes plataformas através das quais um usuário interage com um aplicativo | Sequência | WEB, CELULAR, TABLET | Não |
firstName | Nome do Cliente | Sequência | Sim | |
middleName | Nome do meio do cliente | Sequência | Não | |
lastName | Sobrenome do Cliente | Sequência | Não | |
email | Endereço de e-mail do cliente | Sequência | Não | |
programAccount | Informações sobre Loyalty-related | programAccount | Consulte a seção Add loyalty -> programAccount abaixo para obter detalhes do objeto | Não |
CardDetails | Detalhes do cartão de crédito do cliente | CardDetails | Consulte a seção Restrict payment card -> Payload details abaixo para obter detalhes do objeto | Não |
Exemplo de informações do usuário CURL
curl --location 'https://example.com/userinfo' \
--header 'client_id: {clientId}' \
--header 'Authorization: Bearer {acess_token from token endpoint}'
Exemplo de resposta do Userinfo
{
"membershipId": "12345678",
"languageID": "en",
"middleName": "MiddleName",
"lastName": "LastName",
"firstName": "FirstName",
"email": "test@expediagroup.com",
"programAccount": {
"programId": "Gold",
"loyaltyAccountBalance": {
"value": "10000",
"currency": "Points"
}
}
}
Inclusão de programas de fidelidade
Como parte do seu modelo de site, você pode oferecer aos seus clientes a capacidade de juntar pontos de fidelidade nas compras de viagens. Se você quiser, o seu modelo também pode permitir que clientes usem pontos de fidelidade acumulados para comprar viagens.
Os mesmos requisitos de configuração da implementação padrão se aplicam, assim como muitos dos valores. Somente os que são diferentes estão incluídos aqui.
Além do padrão user information
, a configuração do programa de fidelidade incluirá os seguintes valores.
programAccount
Campo | Descrição | Tipo de dados | Obrigatório? |
---|---|---|---|
programId | Identificador do programa de fidelidade ao qual o cliente é afiliado ou o nome do nível associado ao programa de fidelidade. | Sequência | Sim |
loyaltyAccountNumber | Número da conta do programa de fidelidade do cliente. Deve ser preenchido somente se um identificador secundário, diferente do membershipId exclusivo, for necessário para operações do programa de fidelidade. | Sequência | Não |
lastFourDigitsOfCreditCard | Últimos quatro dígitos do cartão de crédito que o cliente usou na reserva. | Inteiro | Não |
accountName | Nome do programa (se diferente do nome do nível). | Sequência | Não |
loyaltyConversionRatio | Proporção usada para converter o pagamento em pontos ganhos, por exemplo, R$ 1 = 1 ponto. | Duplo | Não |
loyaltyAccountBalance | Saldo atual dos pontos de fidelidade ganhos pelo cliente. | Valor (consulte a seção Valor abaixo para obter detalhes do objeto) | Não |
Valor
Campo | Descrição | Tipo de dados | Obrigatório? |
---|---|---|---|
value | Saldo do programa de fidelidade, aninhado em loyaltyAccountBalance . | Long | Sim |
currency | A moeda usada pelo programa de fidelidade, por exemplo, reais, dólares americanos, pontos ou milhas, aninhada em loyaltyAccountBalance . | Sequência | Sim |
Restrição do cartão de pagamento
Podemos configurar o seu site para que clientes usem o cartão de crédito da sua organização para fazer reservas. Isso é opcional, pois todas as soluções de modelo podem aceitar todos os principais cartões de crédito ou débito (e, nos EUA, PayPal).
Segurança e armazenamento do cartão de crédito
Se você optar por exigir a compra usando o cartão de crédito personalizado da sua organização, queremos que sinta segurança. Lidamos com isso das seguintes maneiras:
- As informações do cartão são armazenadas em um formato tokenizado que é vinculado ao perfil do cliente na Expedia. O armazenamento nunca é feito sem criptografia.
- Nenhum ser humano tem acesso aos dados não criptografados do cartão, e a descriptografia só acontece com credenciais seguras do IAM.
- Quando um cartão é pré-carregado na página de pagamento, somente a descrição do cartão fica visível, não o número.
- O cliente deve inserir o código de segurança do cartão para concluir a reserva com o cartão armazenado.
Requisitos de configuração
Além dos requisitos de configuração da implementação padrão, adicionar o cartão de crédito significa que vamos precisar de:
- Um ponto de extremidade a ser usado para o parâmetro AuthnRequest.
- A sua chave pública para verificação de assinatura.
Vamos usar a chave privada da Expedia para assinar o conteúdo do AuthnRequest e a nossa chave pública para fornecer validação de assinatura para você.
Detalhes de conteúdo
Junto com os atributos descritos na implementação padrão, quando um cliente faz login no seu site, o SSO do cartão de crédito inicia o envio de dois parâmetros de transação para o ponto de extremidade seguro de SSO da Expedia:
- API de informações do usuário: conteúdo de resposta codificado e assinado com asserções assinadas e criptografadas.
- RelayState: um deep link para o URL da página de chegada.
O conteúdo também vai conter os seguintes dados do cartão de crédito:
Campo | Descrição | Obrigatório? |
---|---|---|
cardNumber | O número do cartão a ser cobrado. | Sim |
cardType | Tipo de cartão usado (por exemplo, Visa, MasterCard, American Express). | Sim |
expirationDate | Data de validade do cartão usado. | Sim |
BillingAddress | Endereço de cobrança associado ao cartão usado. | Sim |
addressCategoryCode | O tipo de endereço a ser cobrado (por exemplo, residencial ou comercial), aninhado em BillingAddress . | Sim |
firstAddressLine | Primeira linha do endereço de cobrança, aninhada em BillingAddress . | Sim |
secondAddressLine | Segunda linha do endereço de cobrança, aninhada em BillingAddress . | Não |
thirdAddressLine | Terceira linha do endereço de cobrança, aninhada em BillingAddress . | Não |
cityName | Cidade do endereço de cobrança, aninhada em BillingAddress . | Sim |
provinceName | Província do endereço de cobrança, aninhada em BillingAddress . | Sim |
postalCode | Código postal do endereço de cobrança, aninhado em BillingAddress . | Sim |
countryCode | Código do país do endereço de cobrança, aninhado em BillingAddress . | Sim |