Bugs comuns de codificação de URL em redirects OAuth
Problemas de redirect OAuth costumam vir de double encoding, falta de codificação e confusão entre query strings e URLs aninhadas.
Problemas de redirect OAuth muitas vezes são bugs de codificação de URL com etiqueta de autenticação. O provedor diz que redirect_uri não confere, o callback perde um parâmetro ou uma URL de retorno aninhada quebra após o login.
A maioria vem de um destes três lugares: codificação ausente, double encoding ou codificação do limite errado.
O redirect URI deve coincidir exatamente
Provedores de identidade costumam comparar redirect URIs de forma estrita. Estes podem ser valores diferentes:
https://app.example.com/callbackhttps://app.example.com/callback/https://app.example.com/callback?source=loginhttps%3A%2F%2Fapp.example.com%2Fcallback
O valor registrado, a requisição de autorização e a rota de callback da aplicação precisam concordar.
URLs aninhadas exigem cuidado
Padrão comum: URL de login com destino de retorno:
/login?return_to=/billing?tab=invoices&page=2
Os ? e & aninhados pertencem à URL de retorno, não à query externa de login. Sem codificação, o parser externo divide errado.
A forma mais segura codifica o valor aninhado:
/login?return_to=%2Fbilling%3Ftab%3Dinvoices%26page%3D2
Use o Codificador / Decodificador de URL para inspecionar cada limite separadamente.
Cuidado com double encoding
Double encoding ocorre quando o valor é codificado no seu código e de novo por framework ou cliente HTTP.
Sinais:
%253Aonde você esperava%3A.%252Fonde você esperava%2F.- Provedor mostrando redirect URI que ainda tem
%após decodificar uma vez.
Decodifique uma camada por vez. Se só fica legível após duas decodificações, ache onde a segunda codificação acontece.
Espaço e sinal de mais nem sempre são iguais
Em application/x-www-form-urlencoded, + muitas vezes representa espaço. Na codificação percentual geral de URL, espaços são %20 e + é literal.
Parâmetros OAuth passam por form posts, URLs, logs e helpers de SDK. Seja explícito sobre qual modo de codificação está em uso.
Checklist de depuração
Quando o callback falha:
- Compare redirect URI registrado com o valor da requisição.
- Decodifique o valor da requisição exatamente uma vez.
- Verifique se URLs aninhadas estão codificadas como um único valor de parâmetro.
- Procure
%25— sinal de que%foi codificado. - Confirme que
stateenoncesobrevivem ao round trip.
OAuth pode ser complexo, mas muitos bugs de redirect ficam simples quando você separa cada camada da URL.