IdentityServer4. Conceitos básicos. OpenID Connect, OAuth 2.0 e JWT

Com este post, quero abrir uma série de artigos dedicados ao IdentityServer4. Começaremos pelos conceitos básicos.

Atualmente, o protocolo de autenticação mais promissor é OpenID Connect, e o protocolo de autorização (concessão de acesso) é OAuth 2.0. IdentityServer4 implementa esses dois protocolos. Ele é otimizado para resolver problemas típicos de segurança.

OpenID Connect — é um protocolo e padrão de autenticação, não concede acesso a recursos (Web API), mas como foi desenvolvido sobre o protocolo de autorização OAuth 2.0, permite obter os parâmetros do perfil do usuário como se você tivesse obtido acesso ao recurso UserInfo.

JWT (JSON Web Token) é um padrão da web que define como transmitir dados sobre o usuário em formato JSON de forma criptografada.

OAuth 2.0 (RFC 6749) — é um protocolo e padrão de autorização. Ele permite que aplicativos acessem recursos protegidos, por exemplo, Web APIs.

Vamos dar uma olhada no diagrama de acesso a um recurso protegido e entender os passos principais e a terminologia aceita:

IdentityServer4. Conceitos básicos. OpenID Connect, OAuth 2.0 e JWT

  1. O cliente solicita ao usuário permissão para se autenticar em seu nome. Cliente — é um aplicativo cliente que acessa recursos protegidos em nome do proprietário dos recursos. Recurso — são todos os nossos serviços protegidos Web API.

  2. O usuário permite que o aplicativo cliente se autentique em seu nome, por exemplo, inserindo um login e uma senha. O login e a senha servirão como concessão de autorização para o aplicativo cliente. Usuário (proprietário do recurso) — é um programa ou pessoa que pode conceder acesso a recursos protegidos, por exemplo, inserindo um login (username) e uma senha (password);

  3. O aplicativo cliente solicita um token de acesso ao IdentityServer4 fornecendo informações sobre si mesmo (client_id, client_secret), fornecendo a permissão de autorização do usuário (nome de usuário, senha) e fornecendo grant_type e scope. Em seguida, o servidor de autorização verifica a autenticidade do cliente e as credenciais do proprietário do recurso (login e senha).

    O protocolo OAuth 2.0 realiza a autenticação não apenas do usuário, mas também do aplicativo cliente que acessa os recursos. Para isso, o protocolo prevê parâmetros como client_id e client_secret.
    client_id — é o identificador do aplicativo cliente, utilizado IdentityServer4 para procurar informações sobre o cliente.
    client_secret é o equivalente à senha para o aplicativo cliente e é usado para autenticar o aplicativo cliente na IdentityServer4. O segredo do cliente deve ser conhecido apenas pelo aplicativo e pela API. Com base no exposto, podemos concluir que IdentityServer4 deve estar ciente de seus clientes.

  4. Se a autenticidade do aplicativo for confirmada e a autorização for válida, IdentiryServer4 cria um token de acesso (token de acesso) para o aplicativo e uma chave de atualização opcional (refresh-token). O processo de autorização está concluído. Se a solicitação for inválida ou não autorizada, o servidor de autorização retorna um código com a mensagem de erro correspondente.

  5. O aplicativo cliente solicita dados da API Web protegida, fornecendo o token de acesso para autorização. Se o código de resposta do servidor de recursos 401, 403 ou 498, o token de acesso usado para autenticação é inválido ou expirou.

  6. Se o token for válido, Web API fornece dados para o aplicativo.

Tipos de tokens

Clientes registrados têm permissão para solicitar IdentityServer4 tokens de identidade, IdentityServer4 identidade-token, access-token e refresh-token.

  • token de identidade (identity-token) — é o resultado do processo de autenticação. Contém o identificador do usuário e informações sobre como e quando o usuário é autenticado. Pode ser estendido com seus próprios dados.
  • token de acesso (access-token) — é enviado para a API protegida e utilizado por ela para autorização (permissão de acesso) aos seus dados.
  • token de atualização (refresh-token) — é um parâmetro opcional que o servidor de autorização pode retornar em resposta ao pedido de um token de acesso.

Vamos introduzir mais dois conceitos:

Authentication Server Url — é o ponto final para obter a chave de acesso. Todos os pedidos para fornecer e renovar chaves de acesso serão direcionados para este URL.

Resource Url — é o URL do recurso protegido, ao qual se deve acessar, enviando a chave de acesso no cabeçalho de autorização.

Solicitação de chave de acesso

Para solicitar a chave de acesso, o cliente faz POST uma solicitação para o ponto final IdentityServer4 com o seguinte cabeçalho

'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
'Expect': '100-continue'

e enviando os seguintes parâmetros:

'grant_type' : 'password',
'username' : login,
'password' : password,
'scope' : 'scope',
'client_id' : 'client_id',
'client_secret' : '{client_secret}'

nome de usuário, senha, client_id e client_secret que foram analisados acima. Vamos analisar os outros parâmetros:

grant_type — tipo de concessão ou tipo de autorização. O tipo de autorização depende do método de solicitação de autorização usado pelo aplicativo, assim como dos tipos de autorização suportados pela API. No nosso caso, ele terá o valor senha, que de acordo com a especificação OAuth 2.0 corresponde à concessão de credenciais de acesso do proprietário do recurso (autorização por login e senha).

Protocolo OAuth 2.0 define os seguintes tipos de concessões que requerem interação obrigatória com os usuários:

  • código de autorização (authorization code). É um dos tipos mais comuns de autorização, pois se adapta bem a aplicações servidoras (server-side applications), onde o código-fonte do aplicativo e o segredo do cliente não estão acessíveis a terceiros;
  • implícito (implicit). O tipo implícito de autorização é utilizado por aplicativos móveis e web, onde a privacidade do segredo do cliente não pode ser garantida;

E os tipos de concessões que podem ser realizados sem interação direta com os usuários:

  • credenciais do proprietário do recurso (resource owner). Esse tipo de autorização deve ser utilizado apenas quando o aplicativo cliente é de confiança do usuário e o usuário se sente à vontade para inserir seu login e senha. Esse tipo de autorização deve ser usado somente quando outras opções não estão disponíveis. Esse tipo de autorização é conveniente para clientes corporativos que já utilizaram as credenciais dos usuários dentro de seu sistema e desejam migrar para OAuth 2.0.
  • credenciais do cliente. São utilizadas quando o aplicativo acessa a API. Isso pode ser útil, por exemplo, quando o aplicativo deseja atualizar suas próprias informações de registro no serviço ou URI de redirecionamento, ou acessar outras informações armazenadas na conta do aplicativo no serviço através da API do serviço.

scope é um parâmetro opcional. Ele define o escopo. O token de acesso retornado pelo servidor concederá acesso apenas aos serviços que estão dentro desse escopo. Ou seja, podemos combinar vários serviços sob um único escopo e, se o cliente receber a chave de acesso a esse escopo, ele obterá acesso a todos esses serviços. O escopo também pode ser usado para restringir os direitos de autorização (por exemplo, acesso somente leitura ou gravação)

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster