Para usar a API do Google Drive, eu tenho que brincar com a autenticação usando OAuth2.0. E eu tenho algumas perguntas sobre isso.
O ID e o segredo do cliente são usados para identificar o que é meu aplicativo. Mas eles devem ser codificados se for um aplicativo cliente. Portanto, todos podem descompilar meu aplicativo e extraí-los do código-fonte. Isso significa que um aplicativo ruim pode fingir ser um bom aplicativo usando o ID de cliente e o segredo do aplicativo bom? Então, o usuário mostraria uma tela pedindo permissão para um aplicativo bom, embora na verdade seja solicitada por um aplicativo ruim? Se sim, o que devo fazer? Ou na verdade eu não deveria me preocupar com isso?
No aplicativo móvel, podemos embutir uma visualização da web em nosso aplicativo. E é fácil extrair o campo de senha no webview porque o aplicativo que está pedindo permissão é na verdade um "navegador". Portanto, o OAuth no aplicativo móvel não tem o benefício de o aplicativo cliente não ter acesso à credencial do usuário do provedor de serviços?
Respostas:
Comecei a escrever um comentário sobre sua pergunta, mas descobri que há muito a dizer, então aqui estão minhas visões sobre o assunto na resposta.
Sim, há uma possibilidade real para isso e houve alguns exploits baseados nisso. A sugestão é não manter o segredo do aplicativo em seu aplicativo, há até uma parte na especificação de que aplicativos distribuídos não devem usar esse token. Agora você pode perguntar, mas XYZ requer isso para funcionar. Nesse caso, eles não estão implementando a especificação corretamente e você deve A não usar esse serviço (provavelmente) ou B tentar proteger o token usando alguns métodos ofuscantes para tornar mais difícil encontrar ou usar seu servidor como proxy.
Por exemplo, havia alguns bugs na biblioteca do Facebook para Android em que estava vazando tokens para Logs. Você pode descobrir mais sobre isso aqui http://attack-secure.com/all-your-facebook-access-tokens-are-belong -para nós e aqui https://www.youtube.com/watch?v=twyL7Uxe6sk . Em suma, seja extremamente cauteloso com o uso de bibliotecas de terceiros (bom senso, na verdade, mas se o sequestro de tokens for sua grande preocupação, adicione outro fator para cautela).
Eu venho reclamando sobre o ponto 2 há algum tempo. Eu até fiz algumas soluções alternativas em meus aplicativos para modificar as páginas de consentimento (por exemplo, alterar o zoom e o design para caber no aplicativo), mas nada me impedia de ler os valores dos campos dentro da visualização da web com nome de usuário e senha. Portanto, eu concordo totalmente com seu segundo ponto e considero um grande "bug" nas especificações do OAuth. O fato de que "o aplicativo não tem acesso às credenciais dos usuários" na especificação é apenas um sonho e dá aos usuários uma falsa sensação de segurança ... Também acho que as pessoas geralmente suspeitam quando o aplicativo pede suas credenciais do Facebook, Twitter, Dropbox ou outras. Duvido que muitas pessoas comuns leiam as especificações do OAuth e digam "Agora estou seguro", mas, em vez disso, usam o bom senso e geralmente não usam aplicativos nos quais não confiam.
fonte
Eu tive a mesma pergunta que a pergunta 1 aqui, e fiz algumas pesquisas recentemente, e minha conclusão é que não há problema em manter o "segredo do cliente" em segredo. O tipo de cliente que não mantém a confidencialidade do segredo do cliente é chamado de "cliente público" na especificação OAuth2. A possibilidade de alguém mal-intencionado conseguir obter o código de autorização e, em seguida, o token de acesso é evitada pelos seguintes fatos.
1. O cliente precisa obter o código de autorização diretamente do usuário, não do serviço
Mesmo que o usuário indique o serviço em que confia no cliente, o cliente não pode obter o código de autorização do serviço apenas mostrando o ID do cliente e o segredo do cliente. Em vez disso, o cliente deve obter o código de autorização diretamente do usuário. (Isso geralmente é feito por redirecionamento de URL, sobre o qual falarei mais tarde.) Portanto, para o cliente malicioso, não é suficiente saber o ID / segredo do cliente em que o usuário confia. Ele precisa envolver ou falsificar o usuário para fornecer o código de autorização, o que deve ser mais difícil do que apenas saber o ID / segredo do cliente.
2. O URL de redirecionamento está registrado com o ID / segredo do cliente
Vamos supor que o cliente malicioso de alguma forma conseguiu envolver o usuário e fazê-lo clicar no botão "Autorizar este aplicativo" na página do serviço. Isso acionará a resposta de redirecionamento de URL do serviço para o navegador do usuário com o código de autorização com ele. Em seguida, o código de autorização será enviado do navegador do usuário para a URL de redirecionamento, e o cliente deve estar ouvindo na URL de redirecionamento para receber o código de autorização. (O URL de redirecionamento também pode ser localhost, e percebi que essa é uma maneira típica de um "cliente público" receber o código de autorização.) Como esse URL de redirecionamento está registrado no serviço com o ID / segredo do cliente, o cliente malicioso não têm uma maneira de controlar para onde o código de autorização é fornecido.
fonte
Respondendo à segunda pergunta: as APIs do Google por motivo de segurança determinam que a autenticação / login não pode ser feito dentro do próprio aplicativo (como as visualizações na web não são permitidas) e precisa ser feito fora do aplicativo usando o navegador para melhor segurança, que é explicado mais detalhadamente abaixo: https: //developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html
fonte