Qual é a diferença entre os dois streams de trabalho? Quando usar o stream de código de autorização?

O OAuth 2.0 tem vários streams de trabalho. Eu tenho algumas perguntas sobre os dois.

  1. 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 para o token de access.
  2. Fluxo de concessão implícito – O usuário efetua login no aplicativo cliente, o servidor de autorização emite um token de access diretamente ao aplicativo cliente.

Qual é a diferença entre as duas abordagens em termos de segurança? Qual deles é mais seguro e por quê?

Não vejo uma razão pela qual uma etapa extra (código de autorização de troca para token) seja adicionada em um stream de trabalho quando o servidor pode emitir diretamente um token do Access.

Diferentes sites dizem que o stream de código de autorização é usado quando o aplicativo cliente pode manter as credenciais seguras. Por quê?

O access_token é o que você precisa para chamar um recurso protegido (uma API). No stream do Código de Autorização, existem 2 etapas para obtê-lo:

  1. O usuário deve autenticar e retornar um code para o consumidor da API (chamado de “Cliente”).
  2. O “cliente” da API (geralmente seu servidor web) troca o code obtido em # 1 por um access_token , autenticando-se com um client_id e client_secret
  3. Em seguida, ele pode chamar a API com o access_token .

Portanto, há uma verificação dupla: o usuário que possui os resources apresentados por meio de uma API e o cliente usando a API (por exemplo, um aplicativo da Web). Ambos são validados para access a ser concedido. Observe a natureza de “autorização” do OAuth aqui: o usuário concede access a seu recurso (por meio do code retornado após a autenticação) a um aplicativo, o aplicativo obtém um access_token e chama o nome do usuário.

No stream 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 o access_token pode, enquanto no exemplo anterior, apenas o aplicativo da web (normalmente não é acessível a ninguém).

O stream implícito geralmente é usado em cenários em que o armazenamento do client id e client secret não são recomendados (um dispositivo, por exemplo, embora muitos façam isso de qualquer maneira). Isso é o que o termo de responsabilidade significa. As pessoas têm access ao código do cliente e, portanto, podem obter as credenciais e fingir que se tornam clientes de resources. No stream implícito, todos os dados são voláteis e não há nada armazenado no aplicativo.

Eu adicionarei algo aqui que não acho que esteja claro nas respostas acima:

  • O Código de Autorização-Fluxo permite que o token de access final nunca atinja e nunca seja armazenado na máquina com o navegador / aplicativo . O código de autorização temporário é dado à máquina com o navegador / aplicativo, que é então enviado para um servidor. O servidor pode então trocá-lo por um token de access completo e ter access a APIs, etc. O usuário com o navegador obtém access à API somente através do servidor com o token.
  • O stream implícito pode envolver apenas duas partes e o token de access final é armazenado no cliente com o navegador / aplicativo. Se esse navegador / aplicativo for comprometido, o mesmo será seu token de autenticação, o que pode ser perigoso.

tl; dr não usa stream implícito se você não confia na máquina do usuário para armazenar tokens, mas confia em seus próprios servidores.

A diferença entre ambos é que:

  1. No stream Implícito, o token é retornado diretamente por meio do URL de redirecionamento com o sinal “#” e isso é usado principalmente em clientes javascript ou aplicativos móveis que não têm servidor do próprio, e o cliente não precisa fornecer seu segredo em algumas implementações .

  2. No stream do código de autorização, o código é retornado com “?” para ser legível pelo lado do servidor, o lado do servidor deve fornecer o segredo do cliente desta vez ao token url para obter o token como object json do servidor de autorização. Ele é usado no caso de você ter um servidor de aplicativos que possa manipular 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 seu aplicativo cliente, que é mais um “código de autorização” seguro, pois ele solicita o segredo no cliente e o token pode ser enviado entre o servidor de autorização e o aplicativo cliente em uma conexão muito segura. restringir alguns clientes a usar apenas “Código de autorização” e proibir Implicit

A concessão implícita é semelhante à concessão do código de autorização com duas diferenças distintas.

Destina-se a ser usado para clientes baseados em agente de usuário (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 access, o servidor de autorização retorna um token de access.

Por favor, encontrar detalhes aqui http://oauth2.thephpleague.com/authorization-server/which-grant/

Deixe-me resumir os pontos que aprendi com respostas acima e adicionar alguns dos meus próprios entendimentos.

Fluxo do Código de Autorização !!!

  • Se você tiver um servidor de aplicativos da web que atue como cliente OAuth
  • Se você quiser ter access de longa duração
  • Se você quiser ter access off-line aos dados
  • quando você é responsável pelas chamadas da API que seu aplicativo faz
  • Se você não quiser vazar seu token OAuth
  • Se você não quiser que seu aplicativo seja executado no stream de autorização toda vez que precisar acessar os dados. NOTA: O stream de Concessão Implícita não entretém o token de atualização, portanto, se o servidor de autorização expirar os tokens de access regularmente, seu aplicativo precisará executar o stream de autorização sempre que precisar de access.

Fluxo de Concessão Implícito !!!

  • Quando você não tem o servidor de aplicativos da Web para atuar como cliente OAuth
  • Se você não precisa de access de longa duração, ou seja, é necessário apenas access temporário aos dados.
  • Se você confia no navegador onde seu aplicativo é executado e há uma preocupação limitada de que o token de access vaze para usuários não confiáveis.

Fluxo implícito

Vantagens

  • Mais simples de implementar

Desvantagens

  • Tokens de access visíveis ao navegador
  • A origem dos tokens de access não pode ser determinada
  • Os tokens de access não podem expirar (pela política do Google)

Fluxo do Código de Autorização

Vantagens

  • Mais seguro
  • Tokens de access e tokens de atualização podem ser criados somente se um segredo compartilhado for conhecido
  • Pode ser aprimorado com novos resources de segurança e UX quando eles estiverem disponíveis

Desvantagens

  • Deve implementar vários endpoints de autenticação

Citação: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows

Do ponto de vista prático (o que eu entendi), a principal razão para ter o stream de código Authz é:

  1. Suporte para tokens de atualização (access de longo prazo por aplicativos em nome do usuário), sem suporte implícito: consulte: https://tools.ietf.org/html/rfc6749#section-4.2
  2. Suporte para a página de consentimento, que é um local onde o Proprietário do recurso pode controlar o access a fornecer (tipo de permissão / página de autorização que você vê no google). O mesmo não está lá implícito. Veja a seção: https://tools.ietf.org/html/rfc6749#section-4.1 , ponto (B)

“O servidor de autorização autentica o proprietário do recurso (via user-agent) e estabelece se o proprietário do recurso concede ou nega a solicitação de access do cliente”

Além disso, usando os tokens de atualização, os aplicativos podem ter access de longo prazo aos dados do usuário.

Qual deles é mais seguro e por quê?

Ambos são seguros, depende do ambiente que você está usando.

Não vejo uma razão pela qual uma etapa extra (código de autorização de troca para token) seja adicionada em um stream de trabalho quando o servidor pode emitir diretamente um token do Access.

É simples. Seu cliente não está seguro. Vamos ver em detalhes.

Considere que você está desenvolvendo um aplicativo contra a Instagram API , para registrar seu aplicativo no Instagram e definir quais API's você precisa. Instagram irá fornecer-lhe client_id e client_secrect

Em seu site você configura um link que diz. “Venha e use o meu aplicativo”. Ao clicar neste aplicativo, você deve fazer duas chamadas para a Instagram API .

First envie uma solicitação para o Instagram Authentication Server com os parâmetros abaixo.

 1. `response_type` with the value `code` 2. `client_id` you have get from `Instagram` 3. `redirect_uri` this is a url on your server which do the second call 4. `scope` a space delimited list of scopes 5. `state` with a CSRF token. 

Você não envia client_secret , Você não podia confiar no cliente (O usuário e / ou seu navegador que tentam usar seu aplicativo). O cliente pode ver o script url ou java e encontrar seu client_secrect facilmente. É por isso que você precisa de outro passo.

Você recebe um code e state . O code aqui é temporary e não é salvo em nenhum lugar.

Então você faz uma second chamada para o Instagram API (do seu servidor)

  1. `grant_type` with the value of `authorization_code` 2. `client_id` with the client identifier 3. `client_secret` with the client secret 4. `redirect_uri` with the same redirect URI the user was redirect back to 5. `code` which we have already received. 

Como a chamada é feita a partir do nosso servidor, podemos usar o client_secret com segurança (que mostra como estamos) com o code que mostra o usuário ter concedido o client_id para usar o recurso.

Em resposta, teremos access_token