O que é um URI de redirecionamento?
Um URI de redirecionamento, também conhecido como URL de callback ou URL de redirecionamento, é um URI para indicar onde o Servidor de autorização deve redirecionar o user-agent após a conclusão do Pedido de autorização (Authorization request) .
Universal Resource Identifier (URI) são frequentemente confundidos com URL (Uniform Resource Locator). Para mais informações, confira Desvendando URI, URL e URN .
Vamos dar uma olhada em um exemplo de um authorization request que inclui um URI de redirecionamento:
GET /authorize?response_type=code
&client_id=YOUR_CLIENT_ID
&redirect_uri=https%3A%2F%2Fclient.example.com%2Fcallback
&scope=openid%20profile%20email
&state=abc123
&nonce=123456 HTTP/1.1
Neste exemplo, o valor bruto do parâmetro redirect_uri
é https%3A%2F%2Fclient.example.com%2Fcallback
, que está codificado em URL. O valor real é https://client.example.com/callback
.
Como funciona um URI de redirecionamento?
No contexto do OpenID Connect (OIDC) , o fluxo de trabalho para o OAuth 2.0’s Pedido de autorização (Authorization request) e Servidor de autorização aplica-se de forma semelhante. O URI de redirecionamento funciona da mesma maneira que no OAuth 2.0, tanto para Pedido de autenticação (Authentication request) quanto para OpenID Provider (OP) .
Vamos supor que o Cliente inicie o authorization request a partir do URL https://client.example.com
. Após o usuário completar o processo de autorização, o authorization server redirecionará o user-agent (navegador) de volta para https://client.example.com/callback
.
É claro que o URI de redirecionamento é essencial para o authorization server redirecionar o user-agent de volta quando o processo de autorização estiver completo. Além disso, o URI de redirecionamento também é usado para receber o authorization code ou tokens, dependendo do fluxo.
Aqui está um exemplo não normativo de como o redirecionamento real em um Fluxo de código de autorização (Authorization code flow) pode parecer:
HTTP/1.1 302 Found
Location: https://client.example.com/callback?code=AUTHORIZATION_CODE&state=abc123
Note que os parâmetros de URL code
e state
que são anexados pelo authorization server estão incluídos no URI de redirecionamento. O client precisa extrair os parâmetros code
e state
da URL para continuar o processo de autorização.
Por que precisamos de um URI de redirecionamento?
Como podemos ver no exemplo acima, o authorization server precisa saber para onde redirecionar após um authorization request bem-sucedido. É especialmente útil quando há múltiplos clients (ou seja, Início de sessão único (SSO) ), e cada client tem um URI de redirecionamento diferente.
Com o Fluxo de código de autorização (Authorization code flow) , o URI de redirecionamento também é usado para passar o authorization code de volta para o client, em vez de usar o front-channel (navegador) para evitar expor os tokens a possíveis ataques.
Era possível usar o Resource Owner Password Credentials (ROPC) grant para obter tokens para o usuário sem um URI de redirecionamento. No entanto, ele está obsoleto no OAuth 2.1 devido a preocupações de segurança.
Considerações de segurança
O URI de redirecionamento é um parâmetro crítico e é um alvo comum para atacantes. Aqui estão algumas considerações de segurança a serem mantidas em mente:
- Lista branca de URIs de redirecionamento: O client deve aceitar apenas URIs de redirecionamento que estão registrados com o authorization server. Isso impede que atacantes redirecionem usuários para sites maliciosos.
- Use HTTPS: Sempre use HTTPS para o URI de redirecionamento para proteger a comunicação entre o client e o authorization server.
- Correspondência exata: O URI de redirecionamento deve corresponder exatamente ao URI registrado. Os authorization servers podem impor regras de correspondência estritas que desautorizam padrões de correspondência amplos.
- Parâmetro de estado: Use o parâmetro
state
para prevenir ataques de Falsificação de solicitação entre sites (CSRF) . O client deve validar o parâmetrostate
para garantir que ele corresponda ao valor enviado no authorization request.