OAuth 2.0 possui vários fluxos de trabalho. Eu tenho algumas perguntas sobre os dois.
- Fluxo do código de autorização - O usuário efetua login no aplicativo cliente, o servidor de autorização retorna um código de autorização para o aplicativo. O aplicativo troca o código de autorização pelo token de acesso.
- Fluxo de concessão implícito - O usuário efetua login no aplicativo cliente, o servidor de autorização emite um token de acesso diretamente ao aplicativo cliente.
Qual é a diferença entre as duas abordagens em termos de segurança? Qual é o mais seguro e por quê?
Não vejo uma razão pela qual uma etapa extra (código de autorização de troca de token) seja adicionada em um fluxo de trabalho quando o servidor puder emitir diretamente um token do Access.
Sites diferentes dizem que o fluxo do código de autorização é usado quando o aplicativo cliente pode manter as credenciais seguras. Por quê?
Respostas:
O
access_token
é o que você precisa chamar um recurso protegido (uma API). No fluxo do Código de autorização, existem 2 etapas para obtê-lo:code
a ao consumidor da API (chamado de "Cliente").code
obtido no nº 1 por umaccess_token
, autenticando-se com umclient_id
eclient_secret
access_token
.Portanto, há uma verificação dupla: o usuário que possui os recursos apareceu através de uma API e o cliente usando a API (por exemplo, um aplicativo Web). Ambos são validados para o acesso a ser concedido. Observe a natureza de "autorização" do OAuth aqui: o usuário concede acesso a seu recurso (por meio do
code
retorno após a autenticação) a um aplicativo, o aplicativo recebe umaccess_token
e chama em nome do usuário.No fluxo implícito, a etapa 2 é omitida. Portanto, após a autenticação do usuário, um
access_token
é retornado diretamente, que você pode usar para acessar o recurso. A API não sabe quem está chamando essa API. Qualquer pessoa com aaccess_token
lata, enquanto no exemplo anterior apenas o aplicativo da web (normalmente não é acessível internamente a ninguém).O fluxo implícito é geralmente usado em cenários em que o armazenamento
client id
eclient secret
não é recomendado (um dispositivo, por exemplo, embora muitos o façam de qualquer maneira). É isso que o aviso significa. As pessoas têm acesso ao código do cliente e, portanto, podem obter as credenciais e fingir se tornar clientes de recursos. No fluxo implícito, todos os dados são voláteis e não há nada armazenado no aplicativo.fonte
/authorize
pedido. O navegador e o site que tentam chamar a API (também conhecida como cliente). Esse é oredirect_uri
+code
retornado pelo AS após autenticação bem-sucedida. Finalmente, o cliente chamando o AS nos bastidores, trocando ocode
por umaccess_token
. Este é otoken endpoint
da literatura. Em geral, o AS nunca liga para ninguém. Sempre responde.Vou acrescentar aqui algo que não acho claro nas respostas acima:
tl; dr não usar fluxo implícita se você não confiar na máquina de usuários fichas de espera, mas você fazer confiar em seus próprios servidores.
fonte
access_token
com a ajuda deauthorization code
.A diferença entre ambos é que:
No fluxo implícito, o token é retornado diretamente via URL de redirecionamento com o sinal "#" e é usado principalmente em clientes javascript ou aplicativos móveis que não possuem servidor próprio, e o cliente não precisa fornecer seu segredo em algumas implementações .
No fluxo de código de autorização, o código é retornado com "?" Para ser legível pelo servidor, o servidor deve fornecer o segredo do cliente dessa vez para obter o token url para obter o token como objeto json do servidor de autorização. É usado no caso de você ter um servidor de aplicativos que pode lidar com isso e armazenar o token do usuário com seu perfil em seu próprio sistema e usado principalmente para aplicativos móveis comuns.
portanto, depende da natureza do aplicativo cliente, qual é o "código de autorização" mais seguro, pois ele solicita que o segredo no cliente e o token possam ser enviados entre o servidor de autorização e o aplicativo cliente em uma conexão muito segura, e o provedor de autorização pode restringir alguns clientes a usar apenas "Código de autorização" e desabilitar o Implicit
fonte
A concessão implícita é semelhante à concessão do código de autorização com duas diferenças distintas.
Ele se destina a ser usado por clientes baseados em agentes de usuários (por exemplo, aplicativos da web de página única) que não podem manter um segredo do cliente, porque todo o código e armazenamento do aplicativo é facilmente acessível.
Em segundo lugar, em vez de o servidor de autorização retornar um código de autorização que é trocado por um token de acesso, o servidor de autorização retorna um token de acesso.
Encontre detalhes aqui http://oauth2.thephpleague.com/authorization-server/which-grant/
fonte
Fluxo implícito
Vantagens
Desvantagens
Fluxo do código de autorização
Vantagens
Desvantagens
Citação: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
fonte
Deixe-me resumir os pontos que aprendi nas respostas acima e acrescentar alguns dos meus próprios entendimentos.
Fluxo do código de autorização !!!
Fluxo implícito de subvenção !!!
fonte
Ambos são seguros, depende do ambiente em que você está usando.
É simples Seu cliente não é seguro. Vamos ver em detalhes.
Considere que você está desenvolvendo um aplicativo
Instagram API
e registre seu aplicativoInstagram
e defina o queAPI's
precisa.Instagram
irá fornecerclient_id
eclient_secrect
No seu site, você configura um link que diz. "Venha usar meu aplicativo". Ao clicar nele, seu aplicativo da web deve fazer duas chamadas
Instagram API
.First
envie uma solicitação paraInstagram Authentication Server
com os parâmetros abaixo.Você não envia
client_secret
, não pode confiar no cliente (o usuário e ou o navegador dele que tentam usar seu aplicativo). O cliente pode ver o script url ou java e encontrá-loclient_secrect
facilmente. É por isso que você precisa de outro passo.Você recebe um
code
estate
. Ocode
aqui étemporary
e não é salvo em nenhum lugar.Em seguida, você faz uma
second
chamada paraInstagram API
(do seu servidor)Como a chamada é feita em nosso servidor, podemos usar com segurança
client_secret
(o que mostra como estamos) com ocode
que o usuário concedeuclient_id
para usar o recurso.Em resposta, teremos
access_token
fonte
Do ponto de vista prático (o que eu entendi), o principal motivo para ter o fluxo de código Authz é:
"O servidor de autorização autentica o proprietário do recurso (por meio do agente do usuário) e estabelece se o proprietário do recurso concede ou nega a solicitação de acesso do cliente"
Além disso, usando tokens de atualização, os aplicativos podem obter acesso a longo prazo aos dados do usuário.
fonte
Parece haver dois pontos principais, não discutidos até o momento, que explicam por que o desvio no Tipo de Concessão do Código de Autorização adiciona segurança.
Resumindo : o tipo de concessão do código de autorização mantém informações confidenciais do histórico do navegador e a transmissão do token depende apenas da proteção HTTPS do servidor de autorização.
Versão mais longa:
A seguir, continuarei com a terminologia do OAuth 2 definida na RFC (é uma leitura rápida): servidor de recursos , cliente , servidor de autorização , proprietário do recurso .
Imagine que você deseja que um aplicativo de terceiros (= cliente) acesse determinados dados da sua conta do Google (= servidor de recursos). Vamos supor que o Google use o OAuth 2. Você é o proprietário do recurso da Conta do Google, mas agora opera o aplicativo de terceiros.
Primeiro, o cliente abre um navegador para enviar você para o URL seguro do servidor de autorização do Google. Em seguida, você aprova a solicitação de acesso e o servidor de autorização o envia de volta à URL de redirecionamento fornecida anteriormente pelo cliente, com o código de autorização na sequência de consultas. Agora, para os dois pontos principais:
Com o Tipo de Concessão do Código de Autorização, o token é finalmente obtido por uma chamada do cliente para o servidor de autorização, em que a segurança da transmissão depende apenas do servidor de autorização , e não do cliente.
fonte