Estou tentando implementar a autorização delegada em uma API da Web para aplicativos móveis usando OAuth 2.0. De acordo com a especificação, o fluxo de concessão implícito não oferece suporte a tokens de atualização, o que significa que uma vez que um token de acesso é concedido por um período específico de tempo, o usuário deve conceder permissões para o aplicativo novamente quando o token expira ou é revogado.
Acho que esse é um bom cenário para algum código javascript em execução em um navegador, conforme mencionado na especificação. Estou tentando minimizar as vezes que o usuário deve conceder permissões ao aplicativo para obter um token, então parece que o fluxo do código de autorização é uma boa opção, pois oferece suporte a tokens de atualização.
No entanto, esse fluxo parece depender muito de um navegador da web para realizar os redirecionamentos. Estou me perguntando se esse fluxo ainda é uma boa opção para um aplicativo móvel se um navegador da web incorporado for usado. Ou devo ir com o fluxo implícito?
Respostas:
Esclarecimento: Mobile App = Native App
Conforme declarado em outros comentários e em algumas fontes online, implícito parece ser um ajuste natural para aplicativos móveis, no entanto, a melhor solução nem sempre é clara (e, de fato, implícito não é recomendado pelos motivos discutidos abaixo).
Práticas recomendadas de app nativo OAuth2
Seja qual for a abordagem que você escolher (existem algumas desvantagens a serem consideradas), você deve prestar atenção às práticas recomendadas descritas aqui para aplicativos nativos usando OAuth2: https://tools.ietf.org/html/rfc8252
Considere as seguintes opções
Implícito
Devo usar implícito?
Para citar a Seção 8.2 https://tools.ietf.org/html/rfc8252#section-8.2
Código de autorização
Se você optar pelo Código de autorização, uma abordagem seria usar o proxy por meio de seu próprio componente de servidor da web, o que enriquece as solicitações de token com o segredo do cliente para evitar armazená-lo no aplicativo distribuído nos dispositivos.
Trecho abaixo de: https://dev.fitbit.com/docs/oauth2/
Conclusão
A decisão final deve levar em consideração sua experiência de usuário desejada, mas também seu apetite por risco, após fazer uma avaliação de risco adequada das abordagens selecionadas e compreender melhor as implicações.
Uma ótima leitura está aqui https://auth0.com/blog/oauth-2-best-practices-for-native-apps/
Outro é https://www.oauth.com/oauth2-servers/oauth-native-apps/ que afirma
Consideração PKCE
Você também deve considerar o PKCE, que é descrito aqui https://www.oauth.com/oauth2-servers/pkce/
Especificamente, se você também estiver implementando o Authorization Server, https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/ declara que você deve
Consideração de visualizações da web
Existem muitos exemplos de uso de Web Views, ou seja, um agente de usuário incorporado, mas essa abordagem deve ser evitada (especialmente quando o aplicativo não é original) e, em alguns casos, pode resultar na proibição de usar uma API como trecho abaixo a partir daqui demonstra
Para esclarecer ainda mais, aqui está uma citação desta seção de um rascunho anterior do link de melhores práticas fornecido acima
Alguns pontos interessantes também são levantados aqui: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- uma
fonte
Infelizmente, não acho que haja uma resposta clara para essa pergunta. No entanto, aqui estão as opções que identifiquei:
Se estiver tudo bem em pedir ao usuário suas credenciais, use as Credenciais de senha do proprietário do recurso . No entanto, isso pode não ser possível por alguns motivos, nomeadamente
Se o uso de um fluxo baseado em navegador for necessário, use o Fluxo de código de autorização . Aqui, a definição de
redirect_uri
é um grande desafio, para o qual existem as seguintes opções:redirect_uri
(por exemplourn:ietf:wg:oauth:2.0:oob
) sinaliza o endpoint de autorização para mostrar o código de autorização em vez de redirecionar de volta para o aplicativo cliente. O usuário pode copiar manualmente este código ou o aplicativo pode tentar obtê-lo a partir do título do documento HTML.localhost
servidor no dispositivo (o gerenciamento da porta pode não ser fácil).myapp://...
) que, quando desreferenciado, aciona um "manipulador" registrado (os detalhes dependem da plataforma móvel).Espero que isto ajude
Pedro
fonte
TL; DR: Usar Concessão de Código de Autorização com PKCE
1. Tipo de concessão implícita
O tipo de concessão implícita é bastante popular com aplicativos móveis. Mas não foi feito para ser usado dessa forma. Existem preocupações de segurança em torno do redirecionamento. Justin Richer afirma :
E junto com o fato de que não permite que você atualize o token de acesso, é melhor evitá-lo.
2. Tipo de concessão do código de autorização
A concessão do código de autorização requer um segredo do cliente. Mas você não deve armazenar informações confidenciais no código-fonte do seu aplicativo móvel. As pessoas podem extraí-los. Para não expor o segredo do cliente, você deve executar um servidor como intermediário enquanto o Facebook escreve :
Não é uma solução ideal, mas há uma maneira nova e melhor de fazer OAuth em dispositivos móveis: Chave de prova para troca de código
3. Tipo de concessão de código de autorização com PKCE (chave de prova para troca de código)
Fora das limitações, foi criada uma nova técnica que permite usar o Código de Autorização sem um segredo de cliente. Você pode ler o RFC 7636 completo ou esta breve introdução .
de https://oauth.net/2/pkce/
fonte
Usar um webview em seu aplicativo móvel deve ser uma maneira acessível de implementar o protocolo OAuth2.0 na plataforma Android.
Quanto ao campo redirect_uri, acho
http://localhost
uma boa escolha e você não precisa portar um servidor HTTP dentro da sua aplicação, porque você pode sobrescrever a implementação daonPageStarted
função naWebViewClient
classe e parar de carregar a página da webhttp://localhost
depois de verificar ourl
parâmetro.fonte
A experiência do usuário mais suave para autenticação e mais fácil de implementar é incorporar uma visualização da web em seu aplicativo. Processe as respostas recebidas pelo webview do ponto de autenticação e detecte o erro (cancelamento do usuário) ou aprovação (e extraia o token dos parâmetros de consulta de url). E acho que você pode realmente fazer isso em todas as plataformas. Fiz este trabalho com sucesso para o seguinte: aplicativos ios, android, mac, windows store 8.1, windows phone 8.1. Fiz isso para os seguintes serviços: dropbox, google drive, onedrive, box, basecamp. Para as plataformas não Windows, eu estava usando o Xamarin, que supostamente não expõe todas as APIs específicas da plataforma, mas expôs o suficiente para tornar isso possível. Portanto, é uma solução bastante acessível, mesmo de uma perspectiva de plataforma cruzada, e você não
fonte