Autenticando com o OAuth2 para um aplicativo * e * um site

Estou desenvolvendo um website que é acessado principalmente por meio de um aplicativo e desejo usar o OAuth2 para registro e autenticação de usuários. Como é um aplicativo para Android, vou começar a usar o material OAuth2 do Google, já que ele fornece uma interface decente no Android.

Google afirma que"Você pode optar por usar o sistema de autenticação do Google como uma maneira de terceirizar a autenticação do usuário para o seu aplicativo. Isso pode remover a necessidade de criar, manter e proteger um armazenamento de nome de usuário e senha." que é o que eu quero fazer.Contudo quando eu passo por todos os exemplos e outras coisas, só consigo encontrar coisas sobre ter um websiteou um aplicativo autentica um usuário nos serviços do Google.

E, de fato, quando vou registrar meu aplicativo ("cliente") com o OAuth2 do Google, há opções para clientes de sites e clientes "instalados" (por exemplo, um aplicativo para dispositivos móveis), mas não ambos. Posso criar dois clientes separados, mas li o rascunho do OAuth2 e acho que haverá um problema, que explicarei agora.

Veja como eu imaginei isso funcionando:

O usuário pede ao MyApp para acessar seus dados privados.App usa o AndroidAccountManager class para solicitar um token de acesso para as APIs do Google.Android diz ao usuário "O aplicativo 'MyApp' quer acesso às suas informações básicas no Google. Está tudo bem?"Usuário diz sim.AccountManager conecta-se ao servidor OAuth2 do Google usando as credenciais armazenadas no telefone e solicita um token de acesso.O token de acesso (que segue as linhas verdes) é retornado.AccountManager retorna o token de acesso para MyApp.MyApp envia uma solicitação ao MySite para os dados privados do usuário, incluindo o token de acesso.O MySite precisa verificar o usuário, usando o token de acesso. Valida o tokencomo descrito aqui, com o Google - "Google, este token é válido?".Agora, o que euquer acontecer é que o Google diz "Sim, quem deu a você é realmente esse usuário", mas o que eu acho que realmente acontecerá (com base no rascunho do OAuth2 e na documentação do Google) é que ele dirá "De jeito nenhum! Esse token é válido apenas para MyApp, e você é meu MySite. GTFO! ".

Então, como devo fazer isso? E POR FAVOR, não diga "Use OpenID" ou "Don't use OAuth2" ou outras respostas igualmente inúteis. Ah, e eu realmente gostaria de continuar usando o bomAccountManager UI em vez de pop-up de baixa qualidadeWebViews

Editar

A resposta provisória (vou relatar se funciona!) Da Nikolay é que ela deve realmente funcionar, e os servidores do Google não se importarão de onde o token de acesso veio. Parece um pouco inseguro para mim, mas vou ver se funciona!

Atualizar

Eu implementei esse padrão com o Facebook em vez do Google e isso funciona totalmente. O servidor OAuth2 não se importa de onde vem o token de acesso. Pelo menos o Facebook não, então eu assumo que o Google também não.

À luz disso, é uma idéia muito ruim armazenar os tokens de acesso! Mas também não queremos ter que acessar os servidores do Facebook / Google para verificar a autenticaçãocada pedido, uma vez que vai abrandar tudo. Provavelmente, o melhor é adicionar um cookie de autenticação adicional ao seu site que você distribuir quando o token de acesso for validado, mas uma maneira mais simples é apenas tratar o token de acesso como uma senha e armazenar um hash dele. Você não precisa salgá-lo, pois os tokens de acesso são realmente muito longos. Então, os passos acima se tornam algo como:

9. O MySite precisa verificar o usuário, usando o token de acesso. Primeiro, ele verifica seu cache de tokens de acesso válidos com hash. Se o hash do token for encontrado, ele saberá que o usuário está autenticado. Caso contrário, verifica com o Googlecomo descrito aqui, com o Google - "Google, este token é válido?".

10. Se o Google disser que o token de acesso é inválido, informamos ao usuário sobre o GTFO. Caso contrário, o Google diz "Sim, que é um usuário válido" e, em seguida, verificamos nosso banco de dados de usuários registrados. Se esse nome de usuário do Google (ou o ID do Facebook se estiver usando o Facebook) não for encontrado, poderemos criar um novo usuário. Em seguida, armazenamos em cache o valor com hash do token de acesso.

questionAnswers(6)

yourAnswerToTheQuestion