Transcrições
1. Apresentação: Ei, obrigado por
passar e bem-vindo
ao curso de autenticação
e autorização dotnet seis. Meu nome é Patrick guardas. Você já pode me conhecer do meu canal no YouTube, onde
falei principalmente sobre desenvolvimento
web com dotnet e blazer e também Angular
React e assim por diante. Então, talvez se você não conhece o canal já,
talvez queira dar uma olhada. Muito obrigado
por considerar, mas é claro que você também pode
ficar comigo aqui porque neste curso de
autorização de autenticação, você aprenderá como criar
um usuário em um banco de dados. Então, registrar um usuário, registrar esse usuário implora em largura, nome de usuário e senha. Usaremos um hash de senha e o sal da senha para isso. E, em seguida, criamos
um Web Token JSON. Portanto, isso é uma coisa importante do processo de autenticação. Além disso, além
do token da Web JSON, usaremos tokens de atualização. Portanto, se o
token da Web JSON tiver expirado, veremos
o token de atualização e como você pode atualizar o token da Web JSON
com esse token de atualização. E além disso, é
claro, vamos dar uma
olhada na estrada. Portanto, esta é n, a
parte de autorização em que usaremos uma reivindicação para dar a um usuário funções
específicas e somente
com uma função específica, o usuário pode chamar
determinados endpoints. Então é isso que
vamos fazer. Agora você está
empolgado e quer se juntar a este curso
porque não é tão
longo e, nesse
curto período de tempo, você poderá fazer
tudo isso com dotnet six. Então, espero vê-lo
na primeira lição.
2. Visão geral do curso: Muito obrigado por
ingressar neste curso agora, primeiro, uma visão geral muito rápida.
O que você vai fazer? Trata-se de Tokens da Web JSON, tokens de
atualização e funções. E, claro, a
primeira coisa que
precisamos para isso, nossos usuários. Então, começaremos
criando um modelo de usuário
e também um DTO de usuário, o que significa
objetos de transferência de dados para que enviemos usuário e senha em texto
simples para a API da Web. E a partir disso,
criaremos o hash de senha
e o sal da senha. E então vamos,
isso é importante. Armazenaremos o usuário completo com o nome de usuário
e senha de ID, hash, senha sal no banco de dados. Tudo bem, então isso é o que
vamos fazer primeiro. E depois disso,
tentaríamos bloquear esse usuário. Então, novamente, usaremos
o mesmo usuário DTO, enviaremos o nome de usuário e a
senha para o log n. É o mesmo que usamos
para o registro. Esse DTO então será
usado em nossa API da Web. Criaremos novamente o hash de
senha com a ajuda do salt que é
armazenado no banco de dados. Então é isso que você vai
fazer e quando tudo
estiver correto, então o nome de usuário e
a senha correspondem à equipe que vimos ou
armazenamos no banco de dados. Em seguida, criaremos
o JSON Web Token. Então, este é o primeiro passo. Depois disso, também podemos
criar tokens de atualização. E depois disso,
também daremos uma olhada nos papéis. Então agora o usuário e os
tokens da Web JSON, vamos começar.
3. Criar o Projeto: Estamos aqui com o Visual Studio 2022 e agora vamos
criar um novo projeto. Presumi que você já instalou o dotnet six STK. Portanto, isso é, claro,
requisitos. Então, por favor, se você
ainda não procurou os SDKs dotnet com o
Google, por exemplo, e então apenas
instale essa coisa. E depois disso, abra o
Visual Studio 2022, claro, isso
também é um requisito, mas acho que você
já conseguiu tudo isso. E, em seguida, criamos um projeto ASP
NET Core Web API. Então, basta fazer back-end
nesta classe aqui. E agora vamos chamar isso de API da Web de
autenticação. Por exemplo, a API da Web de
autenticação
é a localização
depende totalmente de você. Tudo bem. Novamente, dotnet six é a
estrutura que queremos usar. Não precisamos de nenhum tipo de
autenticação. Fazemos isso manualmente desta vez. Configuramos para HTTPS, está
tudo bem. Usamos o controlador, então
não estamos usando APIs mínimas aqui. E habilitamos o suporte a API aberta. Isso significa, veja
aqui que podemos usar swagger para testar nossa API. Então, vamos criar
nosso projeto. Tudo bem, e como você pode ver, já
temos
nosso exemplo de projeto aqui com as previsões meteorológicas. Suponho que você já
saiba disso. Portanto, isso não é para o iniciante
absoluto aqui. Então, não vou aprofundar aqui em relação ao projeto de
exemplo. Começaremos imediatamente. Então, a primeira coisa que
precisamos é depois de criar
este projeto, adicionamos alguns modelos.
4. Adicionar o modelo de usuário: A primeira coisa que
precisamos é o modelo de usuário. Para isso. Vamos criar uma nova pasta
primeiro e chamar esses modelos. Agora, aqui, adicionamos uma nova classe
e este será o usuário, e essa também será a entidade que será
armazenada no banco de dados. Então, vamos dar essa coisa I D. O que estou fazendo aqui é
digitar prop para propriedade, clicar em Tab duas vezes e, em seguida,
já podemos inserir a próxima propriedade, que é o nome de usuário. E esta é uma
string vazia por padrão. E outra coisa seguinte, isso já é
interessante e importante. Estamos armazenando um hash de senha, o sal de senha
no banco de dados. Portanto, não o que é sugerido
aqui pelo código IntelliJ. Armazenaremos o array de bytes, que é o hash de senha. E podemos realmente dar a isso um valor padrão,
como a matriz de bytes 32. Tudo bem. Mas muito importante para nós
poderia ser, na verdade, também agora. Mas dessa forma, não vemos essas linhas esbeltas verdes então. Então fique comigo aqui. Acho que isso é totalmente bom. Agora este é o sal. E, novamente, vamos dar a essa
coisa array de bytes por padrão. Tudo bem, então este
é o nosso modelo de usuário, e em alguns minutos também
armazenaremos
isso no banco de dados. Mas primeiro faremos isso, ou
seja, registrar
um usuário sem um banco de dados e somente quando
implementamos isso e você
já teve a ideia de como registro e a criação de
um hash de senha funciona. Em seguida, armazenaremos isso
também no banco de dados. Então esse é o nosso modelo de usuário e já precisamos de mais
uma coisa. E esse seria o objeto de
transferência de dados para o usuário, significa que precisamos de outro objeto, outro modelo onde
podemos transferir o nome de usuário e, em seguida, a senha real em texto
simples para a API da Web. Então, vamos adicionar outro modelo aqui. Adicionamos uma classe e
, em seguida, dizemos o usuário D TO. Claro, você também pode
usar pastas diferentes aqui. Você pode chamar essas
entidades de pasta, por exemplo, e apenas colocar o usuário aqui
porque esta é uma entidade que também é
representada no banco de dados. E, em seguida, outra
pasta para o DTO são os objetos de transferência de dados e
basta adicionar o usuário DTO aqui. Isso depende totalmente de você. A coisa com um usuário DTO
agora é que usaremos essa coisa para
registrar um usuário e também registrar o usuário n.
Você pode se perguntar por que não usar um objeto de
solicitação de registro de usuário e o usuário objeto de solicitação de login,
por exemplo. Bem, podemos usar este DTO
aqui para ambos os casos de uso. Então, vamos apenas digitar a
primeira propriedade que é uma string, na verdade,
o nome de usuário. E, por padrão, para ser enviado para
a string vazia. E agora, de fato, a senha. Então, desta vez, isso
está correto, ok, Agora esses são todos os
modelos que precisamos por enquanto, o próximo passo já é adicionar o
controlador de autenticação. Então, vamos fazer isso em seguida.
5. Adicionar o controlador de autenticação: O
controlador de autenticação, clicamos com
o botão direito do mouse na pasta controladores e depois controlamos simplesmente a
primeira entrada de menu aqui. E então recebemos
algumas sugestões. Não queremos usar
um controlador MVC, queremos usar um controlador de
API. Você vê aqui,
temos um vazio, já
temos uma largura, ler e escrever ações. Então, isso fornecerá algum código gerado para
todas as operações crud, criará, lerá,
atualizará e excluirá. E já temos essa coisa aqui usando o
Entity Framework. Então, muitos códigos já
gerados para nós. Na minha opinião, é sempre
melhor ou quase sempre melhor usar
um vazio, porque então você pode construir qualquer coisa
do zero. Você tem todo o
controle e
sabe o que realmente é feito aqui. E você pode, Bem,
você tem mais controle sobre seu código para fins de
aprendizado. Claro, um vazio também
é bem arrumado. Então, vamos criar um controlador de API
vazio e simplesmente chamamos isso agora de controle
para autenticação. Aqui. Agora, o que eu já
quero fazer é escrever o método para registrar o usuário. Então, o que podemos fazer é
simplesmente tarefa assíncrona pública, então resultado real, eu resultado real seria
suficiente, é totalmente suficiente. Mas se você quiser ver os modelos reais
representados na UI do Silva, então você precisa usar
um resultado real e seguida, definir o modelo exato
que é retornado aqui. E agora tenha cuidado comigo, retornaremos o usuário
com um hash de senha. E agora em produção, é
claro, você
não faria algo assim. Você apenas enviaria o
texto talvez saco ou apenas um código de status de
sucesso 200, ok. Onde o aplicativo, a frente e depois sabe que
tudo deu certo. Mas no nosso caso para ver apenas por enquanto o que realmente está
acontecendo aqui, retornaremos o usuário. Isso é realmente apenas
para fins de aprendizado. E precisamos de outro, precisamos de uma referência de uso aqui, usando diretiva, usando
autenticação, modelos de API da Web. E já que sou um
programador preguiçoso ou só
quero usar as
coisas novas de C-sharp dez. Vamos usar um uso global
aqui no programa CS. Agora, nós já sabemos, também conhecemos o modelo aqui nesta classe no controlador da
Terra, embora não tenhamos nenhuma
edição de referência aqui, não é bom? Agora vamos chamar esse usuário de
registro. Aqui está agora o usuário DDoS
nossos objetos de solicitação aqui. Agora podemos simplesmente
criar um novo usuário. Mais uma vez, isso é só por enquanto. Em alguns
minutos, armazenaremos essa coisa no banco de dados. Mas, por enquanto, vamos
ver como isso parece quando criamos um novo usuário
com o nome de usuário fornecido. E então retornamos, ok, então o código de status 200
com o usuário aqui. Tudo bem, então esse é o nosso método. E agora a última coisa
que é importante, precisamos de um método de solicitação HTTP. E para isso usaremos o método post identifica uma ação que suporta
o método HTTP post. Agora vamos salvar isso
e já
executá-lo e testar isso um pouco.
6. Primeiro teste com SwaggerUI: Então aqui está nosso aplicativo ou a interface do usuário
Swagger para que
possamos testar nossa nova API. E agora vamos usar esse método
off aqui que você já o
vê. O usuário DTL. Portanto, a solicitação é um
nome de usuário
e senha e esperamos um
objeto de usuário, esse é o único. E também vemos nossos modelos aqui. Portanto, este é o usuário e
este é o usuário D TO. Tudo bem, então
vamos escrever. Talvez possamos fazer
algo como Homem de Ferro,
senha, pimenta, clique em Executar. E o que vemos? Id não é como 0. Isso está correto. Quando usamos um banco de dados
, isso será diferente. O banco de dados fará
o trabalho para nós aqui e adicionará um ID 123 e assim por diante. O nome de usuário permaneci. Então, vemos que isso
realmente funcionou. E esses
valores de hash aqui são os, bem, os conjuntos de
bytes inicializados. Portanto, ele não fez nada com essa senha
aqui, é claro, mas vemos que nossa
API já funciona. Agora, o próximo passo que eu
gostaria de fazer é usar injeção de
dependência
porque quando temos toda a nossa lógica
aqui no controlador, esse é um controlador PHET que não é a melhor prática. Então, vamos mudar isso um
pouco e a próxima lição. E adicionamos o serviço de autenticação
e colocamos a lógica lá.
7. Adicionar o serviço de autenticação: Agora, para o serviço de autenticação, recrie uma nova pasta
e chame esses serviços. E também outra pasta
chamou esse serviço desativado. No momento, criamos
uma interface para essa interface chamada esse I de serviço e também uma classe de
implementação chamada
essa coisa de serviço. E, claro, implementamos
a IA do serviço aqui. E quando você pressiona Salvar, sim, queremos reconstruir e
aplicar todas as nossas alterações. E agora, para ter certeza de que injeção de
dependência
funcionaremos, temos que registrar este
serviço aqui no programa CS. Escrevemos
serviços de construção e vamos embora. É um serviço de escopo do tipo especificado no tipo de serviço para a coleção
de serviços específica. Tudo bem, e agora colocamos nosso
olho fora do serviço aqui. Eu tenho que escrevê-lo corretamente
servir este serviço fora do serviço. E é claro que adicionamos a diretiva de
uso e também adicionamos a palavra-chave global para que
nosso controlador em um minuto, também
saibamos onde
encontrar esse serviço. Agora essa coisa está registrada. Isso significa que podemos
injetá-lo no
controlador da Terra em um minuto. Mas primeiro, vamos colocar
nosso método de registro aqui na interface. Usuário da tarefa. Chame esse usuário de registro com o usuário DTO novamente e
chame isso simplesmente solicitações. Agora salve isso. E, claro, eu
salvei muito cedo porque ainda não foi
implementado. Mas com o período de controle, podemos implementar a interface
na palavra-chave assíncrona. Agora, em essência, podemos copiar essa linha aqui
do controlador aqui e simplesmente retornar esse usuário. E terminamos de mover a lógica do controlador
para o serviço de autor. E a próxima coisa
é que temos que injetar esse serviço e juntar
tudo. Então, vamos fazer isso em seguida.
8. Injetar o Serviço (Injeção de Dependência): Para injetar essa coisa, vamos
para o controlador off e adicionamos um construtor aqui primeiro com CTE OR e, em
seguida, pressionamos Tab duas vezes. E aqui agora
dizemos que eu de serviço, chamo essa coisa fora do serviço
e também com período de controle. Agora, podemos criar e
atribuir a esse campo que este serviço está disponível em
todos os lugares neste
controlador agora, e eu gostaria de adicionar
esse sublinhado aqui. E agora aqui,
neste método,
dizemos, por exemplo, resposta
viral pesa solicitações de
usuários registrados no
serviço. Vê isso? Então, agora
temos essa lógica, mudamos para o serviço de autor, e o controlador apenas encaminha a solicitação para o serviço
e retorna os resultados. No nosso caso,
essa seria a resposta. Agora podemos salvar tudo, testá-lo novamente e o resultado
deve ser exatamente o mesmo. Aqui estamos nós. Mais uma vez. Este é o nosso endpoint. Tentamos isso de
novo com o Homem de Ferro. E esta senha
aqui clique em Executar. E isso é exatamente o mesmo que já vimos
quando não estamos, não usamos injeção de dependência. Mas o melhor de novo
é agora que você pode injetar o serviço e a lógica onde quiser em
seu aplicativo. E é definitivamente
uma prática melhor. Tudo bem, então este é o
primeiro código boilerplate. E agora a próxima coisa é
realmente criar o hash de senha. Então, vamos fazer isso em seguida.
9. GitHub Repo: Muito rápido antes de
escrevermos o método para
criar o hash de senha, até agora já
fizemos algumas coisas, então acho que é bom enviar
isso para um repositório Git. Eu fiz isso. E agora você pode obter
o código aqui. Então, se você não
quiser escrevê-lo sozinho, agora é um bom momento para apenas pegar o código aqui do
meu repositório do GitHub. Veja a URL aqui, barra
github.com Patrick recebeu uma API da Web de autenticação de barra. Então, é aqui que você
encontrará o
código-fonte completo dessa classe. Isso só por uma pequena dica. Então, novamente, se você não quiser
escrever o código sozinho, embora eu realmente
recomendo fazê-lo, porque essa é a
melhor maneira de aprender. Você pode obter o código aqui
ou se tiver algum problema. Novamente, você
também pode obter o código, é
claro agora no GitHub.
10. Criar o Hash de senha: Em seguida, criarei
o hash de senha. Então, o que fazemos agora
é voltar
ao serviço de autenticação e
escrever métodos simples. Portanto, este é um vazio privado e chamamos isso de hash de
senha de criação. Essa coisa agora recebe uma senha. Portanto, esta é a senha e textos simples e, em seguida,
dois parâmetros fora, e estes seriam a
matriz de bytes de hash de senha e a senha salt out bites senha hash e também
bytes, sais de senha. Agora, como fazer isso? Na verdade, não é muito. Primeiro criamos uma instância
de um algoritmo de criptografia
e, no nosso caso,
usaremos o HMac 512. Novamente, precisamos de uma
diretiva de uso aqui, usando
criptografia de segurança de sistemas. E aqui agora, quando tivermos essa instância, já temos uma
senha salt e
voltarei para a
senha salt em um segundo. Então esse seria o HMac
e, em seguida, a chave, este é o nosso sal. Agora, para obter o hash de senha, dizemos computar hash e, em seguida, textos
do sistema codificando UTF-8 obtêm bytes e depois a senha. Agora, o que realmente está acontecendo aqui com o método de hash de criação de
senha, geramos um sal. Agora, isso é como afirma aqui, uma chave que é usada no cálculo
do HMac. E quando você combina o
salt com a senha, você obtém um hash de
senha diferente, embora você use
a mesma senha. Agora, para ver melhor todo
o processo aqui, eu
diria que acabamos de testar isso. Vamos usar o método
hash de criação de senha já. E então você
verá quando usarmos a senha pepper
várias vezes, obteremos um valor de hash de
senha diferente. Isso é por causa do sal. Mas se ele sempre
usasse o mesmo salt, o hash de senha
seria o mesmo. E o problema com
isso é que algum dia, pessoas
muito inteligentes decidirão os
algoritmos de criptografia e, em seguida, poderão ver um hash de senha. E a partir do hash de senha, eles podem acessar a senha do texto
plano. Mas isso não é
feito com sal. Ou seja, se eles
não souberem o sal, eles não conseguem obter a
senha, a senha real. Tudo bem, então vamos
tentar isso e então você
verá o que quero dizer com isso. Então, primeiro quando
registramos um usuário, dizemos que criamos
o hash de senha. Então, então crie hash de senha. Essa coisa recebe
a senha aqui. E agora o hash de senha, o sal de senha
que é retornado. Sentido. Aqui. Nós recebemos essa coisa e
também os sais de senha. Tudo bem, então agora temos
nosso valor de hash e sal. E agora aqui para o usuário, o que fazemos é não
apenas definir o nome de usuário, também
definimos o
hash de senha para o hash de senha. Aqui embaixo, definimos a senha
salt para sais de senha, ok, e depois
retornamos o usuário. Então, vamos tentar isso agora. Reinicie o aplicativo. Mais uma vez quando usamos Ironman. E o que vemos agora? Vemos essa corda louca aqui, ou por uma matriz para Bx e assim por diante. Agora, quando eu tento isso de novo, parecendo diferente e novamente
também olhar para diferente. Agora vamos fazer isso de forma
um pouco diferente. Então, digamos que nós damos esse algoritmo de
criptografia já assalto como
novo byte array 32. Então, essa será a
chave que é usada aqui. Tudo bem, veja aqui. Há uma sobrecarga
a uma, a instância sem
a chave ou
o sal, e a instância
com este sal agora, significa isso, significa que agora
neste método de hash computacional, o algoritmo usará este sal aqui toda
vez que fazemos isso. Vamos salvar isso
novamente e reiniciar o aplicativo apenas para ter certeza. Tentamos isso de novo. Experimente. Cara. Sem pimenta. Acertamos Execute for M MPH e executamos novamente
para MPH e assim por diante. Toda vez. O mesmo que você vê nisso
é por isso que precisamos de um sal. O sal é o mesmo e a
senha de texto sem formatação é a mesma, então obtemos o mesmo
valor de hash todas as vezes. Portanto, é o mesmo
se você não usar um sal, o que significa que uma
senha específica sempre resulta no mesmo valor de hash e vice-versa e essência. E agora, quando removemos
isso novamente e realmente usamos uma nova chave
gerada aleatoriamente como sal, obtemos uma senha
diferente, um hash de senha diferente. Toda vez que
usamos esse algoritmo. Tudo bem, veja aqui. É por isso que usamos sal. Espero que você tenha tido a ideia. É assim que criamos
um hash de senha. E agora, antes de continuarmos registrando o usuário e, em seguida,
criando o token da Web JSON. Eu diria que adicionamos nosso banco de dados e
armazenamos o usuário com o hash de senha
e o sal e assim por
diante neste banco de dados. Vamos fazer isso em seguida.
11. Adicione o DataContext & Entity Framework Core: Tudo bem, então queremos
usar o Entity Framework Core aqui e também um banco de dados lite
sequel. Desta vez, uso bancos de dados
diferentes em minhas aulas
e tutoriais. Desta vez, vamos usar um banco de dados
SQL light. Isso é multiplataforma e
bem simples de criar. A primeira coisa agora
antes de podermos realmente usar esse banco de dados é que
precisamos de contextos de dados. Então, novamente, criamos uma nova
pasta chamada esses dados. Aqui. Agora adicionamos uma nova classe e chamamos essa
classe de contexto de dados. E essa coisa aqui usa
a classe de contextos de banco de dados. Não é conhecido aqui. Então, com o período de controle, recebemos algumas sugestões. E queremos usar essa
coisa aqui, instalar o pacote, Microsoft Entity Framework Core, encontrar e instalar a
versão mais recente já feita. Agora está feito. E novamente, podemos usar uma diretiva
global usando aqui porque precisamos
disso em vários lugares. Então, vamos fazer isso assim. E agora temos o contexto de
banco de dados aqui. Com esses contextos de banco de dados, agora, podemos acessar
os usuários do nosso banco de dados. E você vê aqui. Ele diz que uma
instância de contexto de banco de dados representa uma sessão com o banco de dados e pode ser usada para consultar
e salvar
instâncias, instâncias de suas entidades. O contexto do Db é uma combinação
da unidade de trabalho e do padrão do
repositório. Em relação ao padrão do
repositório, é semelhante ao nosso serviço de
autenticação porque agora podemos injetar esse contexto,
por exemplo, em nosso
serviço de autenticação e, em seguida,
acessar novamente os usuários
no banco de dados. Mas ainda temos que fazer alguma
coisa para poder fazer isso. Finalmente, a primeira coisa
é o construtor. Novamente com CD OU nós
novamente nosso construtor. O argumento aqui agora são
as opções de contexto do banco de dados. Essa coisa aqui com a nossa classe. E chamamos isso de Opções. E também temos que
chamar o
construtor base com opções de base. Então, este é agora o
construtor que precisamos. E a última coisa a ser
capaz de adicionar os usuários, ou para ser mais preciso adicionar
a tabela de usuários no banco de dados, precisamos de uma propriedade aqui. E isso é do tipo db
set com classe de usuário. Chamamos isso de usuários e esse será o nome da nossa tabela. Então, geralmente você simplesmente
pluralizaria o nome
dessa entidade. Portanto, os usuários seriam
totalmente suficientes. E acho que esse é um
bom nome para esta tabela. Isso é o que temos que
fazer para adicionar essa tabela. E se você não gosta dessa linha
verde aqui, você já pode dizer que este é
um conjunto de usuários como esse, e então você não recebe mais
aviso. Certo, vamos salvar isso. E agora o próximo passo é usar primeiras migrações de
código
para criar nosso banco de dados. Mas antes que possamos fazer isso, é claro que
precisamos instalar as ferramentas do Entity Framework Core. Então, vamos fazer isso em seguida.
12. Instale ferramentas EF Core: Instale as ferramentas do Entity
Framework Core. Abrimos o console do
gerenciador de pacotes. Você pode abrir essa coisa também aqui em exibir outras janelas
e, em seguida, você obtém o console do Gerenciador de
Pacotes. E também deve haver
um atalho para isso. E aqui agora a primeira
coisa que temos que fazer é que precisamos estar no diretório
correto. Portanto, temos que acessar nosso
diretório de API da Web de autenticação. Aí estamos nós. Então temos que interromper
o aplicativo. Então, feche o terminal aqui. E agora podemos
instalar as ferramentas do EF Core
e, em seguida, a migração. Portanto, certifique-se de interromper
o aplicativo porque caso contrário, não podemos
executar o código primeiro migrações, mas primeiro as ferramentas para isso. Dizemos dotnet new
install e, em seguida, dash, dash global e,
em seguida, dotnet dash EF. Agora, no meu caso, já o
instalei, então deixe-me
desinstalá-lo rapidamente. Então podemos fazer isso juntos aqui. Desinstale o dotnet ef. Você vê aqui, versão 6.3. E agora, se eu executar o comando
install novamente, recebo a versão 604. E com dotnet E F,
podemos verificar novamente. E há as ferramentas de linha de comando
Entity Framework Core dotnet. Então essa coisa eu
fui instalado e seguida, usamos o código
primeiro, migrações.
13. Utilizar o código Primeiras Migrações: Estamos no diretório correto. Temos as ferramentas de
linha de comando instaladas, temos o pacote NuGet de framework de energia instalado, mas há mais dois
pacotes NuGet que temos que instalar. E este é o pacote
de design e o pacote SQL lite de
energia enquadram um núcleo. Agora, o design, você
o verá em um minuto. Deixe-me abrir isso. Então clique com o botão direito do mouse no projeto,
Gerenciar pacotes NuGet. E então apenas dizemos design e acho que já
conseguimos isso. Em seguida, certifique-se de usar
a guia Procurar aqui. Aí está, o Microsoft Entity Framework Core
Design compartilhou componentes de tempo de design para
entrada a partir de ferramentas principais. Então isso é importante para nós. Clique em OK, aceito e em seguida, luz SQL do Entity Framework
Core. Portanto, quando você quiser usar
um banco de dados SQL light, você precisa instalar esse provedor de banco de dados SQL
para Entity Framework Core. Se você quiser usar o SQL Server, então é uma essência apenas
Entity Framework, Core dot SQL Server e assim por diante. Então, por favor, instale
essa coisa agora. Ok, eu aceito que temos nossos pacotes NuGet para que
possamos fechar isso. Agora, o próximo passo é
registrar nossos contextos de banco de dados. Então, novamente para o programa CS. Agora, aqui, dizemos construir
serviços e, em seguida, adicionar contextos
D B com classe de contexto de
dados. E essa coisa. Agora primeiro temos que adicionar
outro usando o erguido aqui. Mais uma vez, vamos adicionar
a palavra-chave global. Então, agora temos
nosso contexto de dados, e isso tem uma opção. Digamos que as opções. Opções. Queremos dizer que
queremos usar o SQL light e podemos adicionar
uma string de conexão aqui. Agora, geralmente, você armazenaria
a cadeia de conexão, por exemplo, no arquivo JSON de configurações do
aplicativo. Você ainda pode fazer isso ou da maneira rápida e suja, já que este é apenas um banco de dados SQL
light, maneira
rápida e suja é simplesmente inserir a string aqui e a cadeia de
conexão para
um banco de dados sqlite. Deixe-me colocar isso em uma nova linha, é simplesmente fonte de dados e
, por exemplo, de dot db. Então, o tipo de arquivo é DB
e ele simplesmente desliga isso. Isso depende totalmente de você. Você pode usar qualquer nome que quiser. E é assim que
registramos o contexto do banco de dados. Com isso, podemos usar
a primeira migração de código para criar nosso banco de dados
com a tabela de usuários. Então, vamos para o console do
Gerenciador de Pacotes novamente, certifique-se de ser colocado em
nosso diretório de projeto. Portanto, a API da Web de
autenticação, a API da Web de autenticação,
é nesse caso. E então podemos
dizer dotnet ef. Então vamos dar uma olhada rápida. Temos três Comandos, banco de dados, contexto
e migrações. E para adicionar uma migração, bem, usamos migrações, então dotnet EF migrações
e, em seguida, adicionamos, e então vamos simplesmente
chamar isso de inicial. Está construindo,
mas foi bem-sucedido e essencialmente
já está feito. O que recebemos agora é uma pasta
Migrações aqui. E aqui você também vê o que acontecerá quando
executarmos essa migração. Vamos criar uma tabela, usar-nos com um ID definido
para incrementos automáticos. Então, temos o
id 123 e assim por diante obtivemos
automaticamente
o nome de usuário como uma string ou um tipo de texto. E as matrizes de bytes
serão usadas com o tipo blob. E já temos
uma chave primária aqui. E se eu remover essa
migração ou função, a função, esse banco de migração, então simplesmente deixaremos cair essa tabela. E agora ainda não temos
o banco de dados, certo? Então, o que está
acontecendo agora quando dizemos que atualização
do banco de dados
dotnet EF não é apenas
atualizá-lo, mas também criará
esse banco de dados. Ok, então você vê aqui
todos os comandos, mas foi bem-sucedido e agora
há uma tabela de criação. Isso é apenas para Energy
Framework, o sistema de migração. E também onde está
Aqui os usuários da tabela. Isso está feito. E aqui vemos esse arquivo de
banco de dados e, na verdade podemos abrir esse
arquivo e dar uma olhada. Nós baixamos mais uma coisa e este seria
o navegador DB,
o navegador de banco de dados
para a linha SQL. Então, vamos fazer isso em seguida.
14. Abra o banco de dados com o navegador DB para SQLite: E isso é o que você
precisa apenas para encaminhar o navegador
TB do Google para SQL lite
ou ir para SQL browser.org. É assim que parece. Então, basta ir para
Download e, em seguida, para o seu sistema operacional,
obtenha essa coisa. Meu caso, não o conheço e
instalei o navegador DB para luz de sequela, o instalador padrão
para Windows de 64 bits. Então, por favor, pegue essa coisa e
então você deve obtê-lo aqui. É assim que parece.
E agora podemos abrir o
banco de dados. Aí estamos nós. Esta é a nossa pasta, este é o dB desligado. Então, vamos abrir essa coisa. E você vê aqui que temos nossa tabela de usuários
com esses campos. E, claro, podemos selecioná-lo
e, em seguida, ir para Procurar dados. E aqui
vemos que não temos usuário. Então, o próximo passo é
armazenar o usuário finalmente, após o registro
no banco de dados. Então, vamos fazer isso
na próxima lição.
15. Armazenar usuário no banco de dados: No Visual Studio,
voltamos para o serviço off. Agora. Nós adicionamos um construtor primeiro
porque, se você se lembrar, queríamos injetar
os contextos de dados. Portanto, CTO é do serviço. E aqui agora dizemos contexto
de dados. Contexto. Novamente, criamos e atribuímos
o campo e um sublinhado. Agora temos nossos contextos de
dados e a próxima coisa é
dizer contextos, usuários, você já o vê aqui. Temos nossa tabela de usuário, Adicionar User Entity Framework nós
Adicionar User Entity Framework que você deseja para o
usuário, mas não terminamos. Também precisamos
salvar essas alterações com um contexto de pesos. Salvar alterações assíncronas, tudo bem, e isso é tudo. Então, agora vamos executar este aplicativo novamente. E eu diria que
adicionamos dois usuários. Aqui estamos nós. Mais uma vez. Tentamos isso
com, por exemplo, pimenta do homem de
ferro que executa. Este é o resultado. Você
vê agora que o ID é um e quando vamos ao nosso navegador, lá está ele,
atualizamos os dados. Iron Man é com id1, hashing de
senha,
sal de senha, blobs e tudo mais. Vamos adicionar mais um. Só por diversão. Senha do Batman,
talvez seja executada. Temos id2 e o mesmo aqui. Tudo bem, então isso funciona. Agora, finalmente, o próximo passo é
criar e retornar
um Web Token JSON. Então, vamos fazer isso em seguida.
16. Adicionar um AuthResponseDto: Serão quatro. Na verdade, podemos criar
o token da Web JSON. Temos que preparar algumas coisas. Uma coisa é que temos que
verificar a senha no login. E isso já
diz que
é claro que também precisamos de
um método de login. E então a terceira
coisa é que precisamos outro DTO para retornar o token web
JSON no final, bem, não é totalmente verdade
que realmente precisamos desse DTO. Mas nos fins desta classe, até o
final deste curso, você terá a opção de
retornar um Token Web JSON
junto com o token de atualização. E isso é, então, apenas
para o front end. Portanto, há dados
nessa resposta AO que são úteis
para o front-end. Então é isso que
vamos fazer. Primeiro criamos
outro modelo aqui. Clique com o botão direito do mouse na pasta models, adicione uma nova classe e agora chamamos essa
coisa de resposta d t. Agora, essa coisa obtém
algumas propriedades. A primeira propriedade, talvez se perguntando por que diabos
precisamos de algo assim? Bem, eu chamo isso de sucesso. Você pode chamá-lo de sucesso. Por exemplo, isso
informará ao front-end se essa solicitação foi bem-sucedida e usaremos isso
para dizer ao front-end, por exemplo, que a senha estava errada ou que o
usuário não existe, ou que está tudo bem. E neste caso,
esse sinalizador está definido como true, mas nós o
inicializamos com falhas. Com essa informação,
o front-end pode fazer outras coisas junto
com essa propriedade agora, que é a mensagem assim. E isso é, por
padrão, string vazia. Além disso, se
você não quiser
retornar essa
resposta de autenticação no DTO, também
podemos dizer que o controlador faz
qualquer coisa com isso. Por exemplo, se usarmos o controlador
novamente para encaminhar a solicitação para o serviço e o serviço retornar esse
DTO, esse objeto aqui. E vemos que o sucesso é o sinalizador de sucesso está definido
como false e temos uma mensagem como se uma
senha estivesse errada, então também podemos decidir não retornar o objeto completo. Podemos apenas dizer que retornamos uma
solicitação ruim, por exemplo, ou uma palavra não autorizada
o que você quiser. Então você ficaria mais flexível
com esse tipo de objeto. Agora, a última coisa por
enquanto, finalmente, o token. Vamos remover esse espaço aqui. E isso também é
uma string vazia. Primeiro, ok, então este é nosso DTO de resposta do autor
com um sinalizador de sucesso, a mensagem e o token. E, em seguida, escreveremos
um método para verificar a senha antes que possamos
finalmente implementar o método de
login.
17. Verificar a senha: É para verificar a senha. Voltamos para nossa
parede de um serviço. Isso é novamente um método particular semelhante a essa coisa na verdade. Assim, podemos copiar e colar, pelo
menos tentar copiar e
colar esse método aqui. E em vez de criar
um hash de senha, agora
queremos verificar
o hash de senha. Então, vamos apenas digitar a verificação aqui. Mais uma vez, obtemos as
senhas planas como uma string. E agora também o
hash de senha e a senha salt, mas não como nossos parâmetros. Obtemos isso
do método de login. E agora aqui
já fizemos isso. Talvez você se lembre, podemos dar esse
algoritmo de criptografia, essa instância de mistura H 512 nítida. Podemos dar a essa coisa
um sal e esse sal. Então tentamos calcular o hash com base na senha
dada, certo? Então agora dizemos que nosso valor de hash
computado é essa coisa com a senha fornecida salt
e a senha fornecida. Depois disso, retornamos sequência de hash
calculada igual
e, em seguida, Password Hash. Como são matrizes de bytes, temos que usar seqüência igual. Claro, mudamos
nosso valor de retorno aqui para valor booleano. Portanto, temos que usar seqüência igual porque
são matrizes de bytes. Se você usasse
apenas os sinais de igual, hash
calculado é igual
ao hash de senha, isso não funcionaria. Portanto, certifique-se de
usar a sequência igual. Diz aqui, determina
o que as duas sequências são iguais
comparando os elementos, usando a comparação de igualdade
padrão para seu tipo. E no nosso caso, essa é
a mordida e o tipo. Então, um byte por byte, isso será comparado
nesse método. Então sabemos se a
senha está correta ou não. Agora, vamos implementar
o método de login em seguida.
18. Implementar o método de login: Para o método de login, novamente, vamos para a interface
aqui e retornamos uma tarefa. E agora você vê isso com
a resposta do autor. Em DTO. Chamamos esse login com o usuário
DTO novamente como uma solicitação. E voltarei para a classe de
implementação. Podemos
implementar automaticamente a interface. E aqui estão os métodos. Deixe-me apenas puxá-lo para cima. Vamos fazer isso aqui, talvez. Aí está ele. Agora, a primeira coisa
é que precisamos do usuário. Então, digamos que o
usuário var agora seja Waitz. Contextos parecem que assim que eu, enquanto digitei o aguarda, Visual Studio editou
a palavra-chave assíncrona aqui. Isso é muito bom. Então lembre-se, se não aconteceu, você precisa adicionar
a palavra-chave assíncrona. Agora contextos e agora
podemos acessar nossos usuários. Então dizemos primeiro
ou assíncrono padrão. E aqui dizemos U para usuário, onde o nome de usuário ocorre, o Nome de usuário da solicitação e,
caso o usuário seja nulo, então, agora podemos retornar
e todos vocês correspondem AO sinalizador de sucesso
é falso por padrão. Mas também podemos
adicionar uma mensagem como o usuário não encontrado, por exemplo, agora o
controlador sabe disso. E também se você
retornar esse objeto, a frente e sabe
disso também. Agora, o próximo passo, se
encontrarmos o usuário, é verificar a senha. Novamente, começamos com um ponto de exclamação if
e depois. Então, verificamos se a senha
não está correta, ela não está verificada. Você fornece essa senha de
solicitação de método. E, em seguida, encontramos o usuário. Então, usamos o hash de senha do usuário e também o sal de
senha do usuário. Agora, se isso estiver errado, retornaremos novamente uma nova resposta de
autenticação DTO com outra mensagem,
como Senha errada. Isso é então verificado e agora,
se tudo estiver correto, retornaremos uma nova resposta do
autor, D20. E vamos apenas dizer que o sinalizador de
sucesso está definido como verdadeiro. Por enquanto. É isso. Não criamos um token. Primeiro nesta etapa
para fins de aprendizado, só queremos verificar se o login
com o nome de usuário
e senha funciona em geral. E para poder testar isso, agora
precisamos de outro
endpoint, é claro. Então, vamos voltar ao nosso controle
off. Mais uma vez. Vamos apenas copiar
esse método aqui. Chamamos isso agora simplesmente de fazer login. Também chamamos aqui
nossos métodos de login. E agora vamos dizer que se a
resposta for bem-sucedida, podemos retornar a resposta OK. Tudo bem, então retornamos
a resposta completa. E, caso contrário, podemos decidir, por exemplo,
poderíamos, também poderíamos retornar um
ok com a resposta. E, nesse
caso, o front-end tem que verificar se o sucesso é verdadeiro ou falso e, em seguida, mostrar
a mensagem de erro ou não, ou podemos fazer outra coisa. Podemos dizer que solicitações defeituosas
retornarão uma solicitação incorreta e simplesmente adicionarão a mensagem
em resposta. Novamente, como eu disse anteriormente, quando criamos
a resposta auth para esta coisa aqui depende
totalmente de você. Se você acha que
tem um front-end e quer enviar um 200 ok. De volta. Em qualquer caso, com isso
ok, ou retornar, ok. E, em
seguida, responda,
então a frente tem que decidir o que fazer
e, em seguida, faça
assim em qualquer caso. Portanto, você não
precisa verificar aqui com esta cláusula IF aqui se essa resposta for
bem-sucedida ou não. E então você pode apenas alcançar a resposta na frente
e fazer todo o trabalho, ou se você quiser fazer
isso assim e isso é realmente
totalmente com você. Não há melhor prática
na minha opinião aqui. Depende realmente do
aplicativo que você deseja criar. Mas para nossos propósitos de teste, para fins de aprendizado aqui,
acho que isso está tudo bem. Verificamos se a
resposta foi bem-sucedida. Nesse caso, retornamos
a coisa completa. Caso contrário, veremos uma solicitação ruim
apenas com a mensagem. E agora a última coisa que temos que fazer, você pode vê-lo aqui. Temos um método de postagem aqui e também outro método de
postagem aqui. Então isso não funcionaria. Esses são dois exatamente
os mesmos endpoints com exatamente as mesmas rotas. Então, apenas API e, em seguida, desligado
para o controle um objetivo. Então, vamos mudar isso
e podemos alterar isso aqui com postagens HTTP. E então, entre parênteses, definimos a rota para o login. E essa é apenas outra maneira de
escrever algo assim. Também podemos adicionar outro
atributo aqui, o atributo route e, em seguida,
basta remover o login aqui. Isso é, em essência,
exatamente o mesmo. Então, vamos combinar o atributo post HTTP
com o atributo route. E então temos
nossos endpoints. E agora eu diria que salvamos
isso e testamos isso já. Tudo bem, lá nos
lembramos que já temos nossos usuários, Homem de
Ferro e Batman. Então, podemos
testar diretamente o método de login aqui. Então experimente. Por exemplo, vamos
apenas testá-lo. Teste-o com uma string, string que podemos executar e vemos a
mensagem correta que o usuário não foi encontrado. E você também vê o código de
status 400 aqui. Vamos dar uma olhada aqui na guia
Rede, por exemplo, vamos tentar isso novamente. Pressione Executar. Se você vê-lo novamente. Este é o código de status 400, que significa uma solicitação incorreta. Então isso é exatamente
a mesma coisa aqui. E agora vamos
testá-lo com o Homem de Ferro, mas a senha é string. Nós apertamos Executar, recebemos
uma solicitação ruim com a
senha errada da mensagem, está correta. Agora, insira a senha correta. Vemos nosso
DTO de resposta Auth com sucesso, verdade, sem mensagem, sem token. Mas isso é o que
vamos mudar a seguir. Então agora, finalmente,
criaremos o token da Web JSON.
19. Criar e devolver um JSON Web Token: Tudo bem, então de volta
ao Visual Studio. E agora a primeira coisa que precisamos é realmente um segredo. Porque com esse segredo, o back-end pode verificar se o Token da Web JSON para
o qual o front-end ou o
usuário está enviando, o cliente está enviando para o
back-end é realmente válido. Com esse segredo,
recriamos o
token da Web JSON e também usaremos esse segredo para verificar o JSON Web Token e somente o back-end
conhece esse segredo. O segredo não está disponível em essência
no token real, então apenas o back-end conhece o segredo e a
largura desse segredo. Podemos verificar o Token Web JSON
real. Isso é muito importante e existem várias
maneiras de fazer isso. Claro, você pode editar diretamente
no serviço de autenticação. Você pode editar em uma loja, ou a maneira mais fácil aqui, no nosso caso nesta classe, seria o arquivo adjacente de
configurações do aplicativo. Então, adicionamos outra seção aqui, chamamos essas configurações do aplicativo. E então nós apenas inserimos o token. E isso pode ser o que você
quiser. Qualquer tipo de personagem
pode ser usado aqui, qualquer sequência de caracteres, como minha chave secreta, apenas certifique-se de que isso
tenha pelo menos 16 caracteres, caracteres nele, certo? Portanto, o comprimento mínimo deve
ser de 16 caracteres. E com isso, agora podemos acessar chave secreta do
token e
criar nosso token da web JSON. Com isso, agora vamos
gerar o token. Mas também temos que inserir
alguns pacotes NuGet. Mas desta vez vamos
fazer isso ao longo do caminho. De volta ao nosso serviço off. Vamos descer aqui. Criamos um novo método, string
privada, Create Token e
recebemos o usuário aqui. Agora, a primeira coisa, as reivindicações listam reivindicações e
precisamos de outro namespace para essas reivindicações de segurança do sistema. Agora isso é chamado reivindicações e esta é uma
nova lista de reivindicações. Aqui. Agora já
definimos alguns valores, então vamos adicionar uma nova reivindicação. Com identificador de
nome de tipos de reivindicação Esse será o ID do usuário. Então, ID do usuário e, em seguida, defina isso para uma string
ou transfere para uma string. Vamos também adicionar outro. Então, nova reivindicação, nome dos tipos e esse será
o nome de usuário. Isso já é uma string, então vamos adicionar o componente ou
não precisamos de uma vírgula aqui. Ainda não, ainda não. Mais tarde, quando adicionamos as estradas, adicionamos outra reivindicação aqui. Já posso dizer
que quais são as reivindicações? Bem, em essência, essas
são informações sobre os dados do usuário serão armazenados no token da Web JSON
e vamos dar
uma olhada no token da web JSON e, em
seguida, ver o que está realmente
armazenado lá. Então, até agora
para obter informações,
bem, a reivindicação
representa uma reivindicação. Então aqui você pode armazenar qualquer coisa, em essência qualquer
informação que você quiser. Isso é o que queremos
armazenar no token da Web JSON. Com isso, o cliente
que sabe, tudo bem, qual é a ideia do usuário
atualmente autenticado
ou do nome de usuário e assim por diante. Certo? Agora, a próxima coisa é uma chave, uma chave de segurança simétrica. Então, vamos criar essa
coisa com a chave var, nova chave de segurança simétrica. E já precisamos de
outra referência aqui. Desta vez. Como eu já disse,
instalamos o pacote Microsoft Identity
Model dois tokens, encontramos e instalamos a
versão mais recente se você não vir aqui no menu de
contexto, por favor. Novamente, vá para Gerenciar pacotes
NuGet e , em seguida, instale este
pacote aqui manualmente ou faça assim. Portanto, ele deve ser instalado. Vamos parar com isso. E lá deveria estar. Temos o modelo de
identidade da Microsoft é namespace de
token. Vamos apenas mover
este rapidamente para o programa CS porque eu quero fazer este banco global aqui. E agora aqui adicionamos
esse namespace. Ótimo, então vamos
voltar ao nosso método. Temos nossa chave de
segurança simétrica, mas ela recebe alguns argumentos. A primeira coisa agora é a primeira
e a única coisa a ser mais exato é o nosso segredo. Com nossa chave secreta, podemos criar essa chave de segurança
simétrica. Então, vamos responder a
codificação de texto do sistema, UTF-8, obter bytes. E agora temos que
acessar a configuração, que é as configurações do aplicativo JSON. Então, temos que fazer uso
da injeção de dependência. E fazemos isso aqui em cima. Então, o que precisamos para injetar isso, a configuração dos olhos. Chame essa configuração. vez, crie um atribuir
a configuração do campo, o sublinhado aqui, assim. Agora aqui, podemos dizer seção
de configuração. E essas são agora, agora são
configurações disso, o token disso. Agora queremos o
valor, feche isso. E temos nossa chave de segurança
simétrica. Com essa chave, podemos criar as credenciais de
login também
necessárias para o nosso token. Vamos chamar isso de créditos. Agora é bastante complexo, mas essa é apenas a maneira de
criar um token da Web JSON. Espero que ainda esteja comigo. Não é um bom momento para estar em
multitarefa, por exemplo. Então, por favor, volte para mim se quiser escrever
o código junto comigo. Agora sabia assinar credenciais
com nossa nova e linda chave. E precisamos de um algoritmo. E agora vamos usar os algoritmos de
segurança. Eu quero realmente
usar o algoritmo de assinatura
HMac SHA, Mac disparou 12. Tudo bem, então esse é o único. Com esses créditos. Agora, com essas credenciais de
login, podemos criar um token de
segurança JWT. Token da Web adjacente, token
de segurança, token var. Agora, um novo token de segurança JWT. Precisamos de algo mais aqui, tokens de
modelo de identidade do
sistema JWT. Mais uma vez, instale
este pacote. Então, novamente, precisamos
adicionar alguns argumentos aqui. Primeiro, a reivindicação,
então ela é armazenada neste novo token. Em seguida, temos que definir datas
de validade. E digamos que essa coisa
seja válida por um dia, então data e hora agora e dias um. Tudo bem. A próxima coisa agora as credenciais de assinatura
são definidas como créditos. E vamos remover essas
coisas aqui e V está pronto. Então agora este é o nosso token e
também obtenha a string final, o token web JSON final. Chamamos var JWT, novo JWT,
token de segurança, um manipulador. Aqui agora dizemos token com o token e depois
retornamos o JWT. Respire fundo. Sei que é complexo, mas é assim que se faz. O importante é que
armazenemos nossas reivindicações no JWT. Definimos datas de expiração e também as
credenciais de login. Isso está aqui para
nossa chave secreta e a seção de
token de configurações do aplicativo. Mais uma vez, aqui está. Esta é a nossa chave secreta. E agora é hora, é
claro, chamar essa coisa de volta
aos métodos de login. Aí estamos nós. Vamos apenas dizer token de string. Agora é criar token
com nosso usuário. Aqui. Agora, definimos o token, token, segurança tudo, ok, e eu saberia, digamos vamos testar isso, vamos
apenas verificar porque acho que
vi isso antes, então vamos salvar isso novamente. E acho que isso, de
outra forma, levaria a um erro. Então, vamos adicionar a vírgula aqui. E agora vamos testar
o aplicativo. Vamos tentar fazer login novamente. Experimente novamente com o Homem de Ferro. Se você pressionar Executar, lá está. Este é o nosso token adjacente
e da Web. É assim que essa coisa parece. Agora há um lado bonito chamado JWT. Oh, aí está. Onde você pode colar
seus tokens da Web JSON. Basta dar uma olhada no
que está lá dentro. E como você pode ver aqui, a primeira parte para a primeira
aqui, o primeiro período. Podemos ver o algoritmo
e o tipo de token. Temos nossa mistura h
de cinco e décimos. tipo de token de algoritmo
é um token JWT. E agora a carga útil
das reivindicações, temos identificador de nome. Este é o ID do usuário e
também a data de validade, que está bem, no dia
seguinte e 21h14. Agora aqui podemos
verificar a assinatura. Portanto, esta é muito legal,
a chave secreta, mas como você pode ver, ela não está disponível aqui, apenas os nós back-end
dessa chave secreta. E vamos dar outra
olhada com o Batman. Batman e traste. Acertamos Execute,
copiamos isso, colamos aqui e você vê que
algo mudou, que é o nome identificado, é
claro que agora é id2, como você pode ver aqui
também, ID 12. E agora temos um minuto depois são agora as datas de
validade. Tudo bem, então isso funciona. Temos nosso
token da web JSON e agora o que
devemos fazer com isso? Bem, vamos criar
outro endpoint que só está disponível
para autorizar usuários. Eu diria. Agora, com esse endpoint, é totalmente
necessário adicionar esse token ao cabeçalho
da sua solicitação. E só então você poderá, ou pode
acessar esses endpoints. E eu diria:
Vamos fazer isso em seguida.
20. Adicionar um Endpoint seguro para usuários autorizados: Certo, então de volta ao Visual Studio. Vamos criar esse endpoint agora. E eu só faço isso aqui
no controlador off nem na implementação do
serviço. Na verdade, só queremos verificar, o usuário
está autorizado e
capaz de chamar isso. Então, agora acabamos de criar
um GetMethod com HTTP. Novamente, esse agora é nosso método de solicitação
HTTP. Vamos apenas usar resultados de uma ação
pública. Então agora nenhuma tarefa, nenhum método assíncrono aqui
e nós apenas retornamos uma string. E vamos chamar isso de Aloha
porque eu amo como Y. Então também podemos retornar. Certo? Aloha. Você está autorizado. Certo, ótimo. Portanto, esse é o nosso endpoint, seja, se chamarmos isso agora, todos devem poder
acessar essa mensagem
ou receber essa mensagem. Então, vamos testar isso rapidamente. Aí está, o
GetMethod aqui, API desativada. Tentamos isso,
atingimos as notas Execute, embora você esteja autorizado. Todos podem fazer isso. Mas agora queremos
garantir essa coisa. E a maneira
mais fácil de fazer isso é apenas usar os atributos autorizados. Portanto, autorize que
seja, ainda não é conhecido, então temos que usar o namespace, autorização
Microsoft ASP NET
Core. E é isso. Ótimo. Bem, vamos testar isso primeiro. Então, de volta a vaguer. Espero que ele reconstrua. Vamos fazer isso manualmente
aqui para ter certeza absoluta. Ok. Agora ele fez o
GetMethod aqui. Agora, apertamos experimentá-lo, executar e recebemos um erro. Bem, espero que
não haja esquema de autenticação especificado. Então você pode
usar o token da Web JSON, precisamos de um esquema de
autenticação. Então, vamos adicionar
isso rapidamente. Voltamos aos nossos programas, sim. E agora aqui em baixo temos que
escrever algumas coisas novamente. Primeiro serviços de construtor
e adicione autenticação. Essa coisa. Agora, ficando
novamente um pouco complicado, queremos um portador de
token da Web JSON padrões. Isso não é conhecido, então vamos dar uma olhada. Podemos instalar o
pacote Microsoft ASP.NET Core
Authentication, portador JWT. Isso é o que precisamos porque
isso é um token de portador. Então encontre e instale
a versão mais recente. Quando essa coisa estiver instalada. Em seguida, podemos usar um esquema de
autenticação. Claro,
paramos o aplicativo e agora ele sabe o que está
acontecendo aqui. O valor padrão é usado
pela autenticação por par. Portador do termo urso. Talvez
você já tenha ouvido. É apenas um símbolo de portador, em
essência, é apenas uma string. Pode ser
uma string curta ao longo da string, Web Token
adjacente,
qualquer outra coisa? Ele é chamado de portador e você verá no
cabeçalho, então
também adicionaremos o espaço do portador de valor e, em seguida, o token da web JSON. Mas veremos
isso em um minuto. Por enquanto,
esquema de autenticação aqui. Agora dizemos adicionar JWT Vera
com algumas opções. Claro, essas
opções se parecem com isso. Então, primeiro, temos opções, parâmetros válidos de
token, que são novos parâmetros e
validação de token. Novamente, eles obtêm alguns valores. Primeiro, validamos a chave de assinatura do
problema. Isso está definido como verdadeiro. Em seguida, a própria chave de
assinatura do emissor, O que é isso novamente,
são chave ultra-secreta. Então, uma nova chave de
segurança simétrica novamente. E novamente
textos do sistema codificando UTF-8. Em seguida, obtenha bytes. Aqui. Agora crie uma configuração. Obtenha configurações de seção, token
e, a partir disso novamente, o valor. Tudo bem, Agora os
dois últimos valida o problema. Podemos definir isso como
falso na verdade e também valida o público também falso. E fechamos isso
aqui, e é isso. Formate essa pequena esperança. E agora temos nosso
middleware, em essência, o serviço de logística ou
apenas um serviço exigido pelos serviços de
autenticação. Então, agora vamos testar
essa coisa novamente. Reconstruído. Vamos dar uma olhada.
Tentamos isso para que ele seja executado. E agora ótimo, temos
um banco não autorizado. Então, para 01 significa autorizado. Mais uma vez, podemos verificar novamente. Quando dizemos executar para 01, pegamos esta bolsa. Esta é a resposta, nenhuma
mensagem, nada disso. Este é apenas o código de status. Não estamos autenticados
e não estamos autorizados a obter isso ou acessar
esse endpoint. Isso é ótimo porque não
enviamos nenhum cabeçalho com isso. Novamente, podemos dar
uma olhada aqui
na guia de rede
que você executaria. E você vê a resposta
definida como cabeçalhos de solicitação, nada com autenticação
ou autorização. Então, isso é o que
temos que fazer a seguir. Temos que definir o cabeçalho de autenticação para
nossas solicitações, para nossa chamada. E para isso temos que mudar esse vetor
u i um pouco. Então, novamente, temos que fazer algumas
coisas nos programas, sim. E também temos que adicionar
middleware para que isso funcione. E então poderemos usar nosso token da Web JSON com a UI
Swagger e x's, o endpoint, o endpoint
autorizado. Então, vamos fazer isso em seguida.
21. Use o JWT com SwaggerUI & o Middleware de Autenticação: De volta ao programa CS aqui
nesta linha X, vaguer Jane, temos que
adicionar mais algumas coisas. É maior. Jen recebe opções. Em relação a essas opções,
dizemos que queremos adicionar uma definição
de segurança. Vamos chamar isso de OAuth2. Em seguida, defina um novo esquema de segurança de
API aberto. Deixe-me remover isso. Basta adicionar outro namespace
aqui. E aqui. Agora podemos dar a essa
coisa uma descrição como cabeçalho de autorização
padrão usando o esquema de portador,
por exemplo, jogo. Isso será então, como eu disse, portador e, em seguida,
o token real assim. Essa seria a descrição. Então podemos definir
o parâmetro em. Então, onde queremos
definir isso ou colocar isso? localização do parâmetro
é o cabeçalho. Então o nome está desligado. O tipo é tipo de
esquema de segurança, chave de
API e ordem para
poder definir isso, temos duas opções. Filtro de operação, depois requisitos de segurança, filtro de
operações. E para isso, temos que
instalar outro pacote,
seu filtro de operação. Aqui, instale o pacote, fivela
swash. Nós paramos com isso. Acho que está instalando agora. Aí está. Agora, isso foi um pouco rápido swashbuckling
ASP NET Core filtros. Este é o pacote que precisamos
com isso agora não terminamos. Também temos que adicionar outro
middleware aqui em baixo. Isso será AB, uso
de autenticação. Ele diz isso aqui como o middleware de
autenticação de recall da Microsoft HP para o construtor de
aplicativos especificado que permite
recursos de autenticação. Isso é ótimo. E agora vamos executar
isso mais uma vez. Voltamos aqui agora primeiro, você vê aqui já
temos um novo botão autorizar. É aqui que podemos
adicionar agora nosso token. Vamos fazer login primeiro aqui com o Homem de Ferro e depois
pimentar e executar. Copiamos o token. Agora podemos definir isso aqui, portador e, em seguida, o espaço do portador de
token, e então o token que
podemos autorizar fechar. Agora tentamos executar
isso, aperte executa. E voila, recebemos
nossa mensagem de volta. E aqui podemos ver que este é o
cabeçalho de autorização que dissemos. Vamos apenas verificar
aqui na guia Rede. Pressione Executar novamente. Vimos em nossos
cabeçalhos de solicitação, dissemos autorização, cabeçalho de autorização,
portador e, em seguida, o token. Agora tudo funciona. Criamos o JSON Web Token, conseguimos usá-lo e obter um acesso autorizado a
endpoints autorizados. Ótimo. Este é, em essência,
o primeiro grande capítulo, e o próximo capítulo agora
é o token de atualização.
22. Atualizar Tokens Introdução: Agora isso já funcionou. Isso é perfeito. Mas a questão é agora, quando você tem seu token da web
JSON, ele está expirando em breve, ou pode ser o
caso de haver um invasor. E com esse invasor, seu token da Web JSON
não é mais seguro. Portanto, esse invasor pega seu
JSON Web Token e, em seguida usa essa coisa para se
autenticar e
você não quer fazer isso. Portanto, é por isso que usamos datas de expiração
mais curtas para nossos Tokens Web JSON, como
15 minutos, por exemplo. Quando fazemos isso, para obter um novo token da Web JSON,
precisamos de um token de atualização
porque, caso contrário, se estiver adjacente, já tenho o
tokenismo válido. E você, como usuário, ainda quer usar
um aplicativo web com o JSON Web Token, isso não funcionaria, mas o que você pode fazer então, e isso é uma essência, a responsabilidade
do front-end. O que você pode fazer é usar um token
de atualização válido por muito mais tempo, por exemplo, uma
semana, sete dias. Portanto, é mais difícil obter
esse token de atualização, então não é mais fácil
para um invasor. E também quando você usar
esse token de atualização, não apenas
atualizaremos
o token da Web JSON, mas também o próprio
token de atualização. Então, tudo é novo então. E você, como usuário, não percebe nada sobre isso. Mas você ainda está autenticado. Também autorize talvez
tudo esteja seguro, certo? Então, vamos dar uma olhada nos tokens de
atualização em seguida.
23. Adicionar Atualizar dados de token ao modelo de usuário: Tudo bem, agora o
primeiro passo para nosso token de atualização é que
queremos armazenar o token de atualização junto com a
data e a hora em esse token foi criado
e quando ele expira. Deseja armazenar isso
no banco de dados junto
com o usuário. Portanto, o primeiro passo é, bem, para estender esse modelo de usuário aqui, adicionamos outra string, que é o token de
atualização real. Obter isso pode ser uma string
vazia como essa. E, em seguida, para uma data e
hora, uma propriedade. primeiro é um token
criado e o próximo, durante o dia, o token expira e você deseja armazenar isso ou adicionar outra migração
ao banco de dados. Então, vamos fazer isso. Se o aplicativo estiver em execução, certifique-se de interrompê-lo. Basta fechar o terminal e depois vamos para o console do
Package Manager. Onde estamos? Bem, temos que
mudar o diretório. Certo, e agora inserimos migrações
dotnet EF em dados de
token de atualização, por exemplo. Vamos dar uma olhada
no arquivo de migração. Aí está. Vemos que
novas colunas serão adicionadas para usar como uma tabela. E se revertarmos
a migração, eles
serão excluídos? Então está tudo bem. Atualizamos o
banco de dados com dotnet. atualizações de banco de dados. Tudo bem, vamos abrir
o banco de dados novamente. O aberto, e agora
já o vemos aqui. Temos o
token de atualização e as datas. E aqui também a
estrutura da tabela. Ótimo, então isso está feito. Temos nossos dados de token de atualização junto com os dados do usuário. E o próximo passo
é criar o token de
atualização no Login.
24. Criar o Token de atualização no Login: Agora, para criar um também
retorna o token de atualização, a primeira coisa que
precisamos aqui é, bem, podemos estender a resposta do
autor DTO e os
dados aqui também. Aqui agora você pode
ver por que faz sentido criar este DTO de resposta de
autenticação, não
podemos apenas enviar
o sinalizador de sucesso com uma mensagem e
o token da web JSON, também
podemos enviar o token de atualização e alguns dados junto com esse token de
atualização. Porque então é
responsabilidade do front-end
decidir quando atualizar
esse token de atualização. Mas veremos isso
em lições futuras. Então, vamos primeiro
adicionar as propriedades. Então, a primeira coisa novamente é
o token de atualização real. Por padrão, novamente, esta
é uma string vazia. E agora também, vamos
adicionar a data de validade, então o token vai expirar. E agora outra coisa que
faz sentido e facilita nossa vida é adicionar
um modelo de token de atualização. Não armazenaremos
isso no banco de dados, não
retornaremos isso. Mas, em nossa lógica, usaremos esse modelo de token de
atualização para colocar os dados aqui. E então você usa esses dados
para fazer outras coisas, como configurar o
token de atualização no cookie. Então, vamos criar
outro modelo aqui, outra classe e chamar
esse token de atualização agora. Aqui dizemos corda de prop. token de atualização é
uma string vazia. Então dizemos data, hora, criamos e vamos
chamar esse token apenas. Agora também, a data e hora expira. Tudo bem, agora de volta
para o serviço de autenticação. E aqui agora podemos criar nosso método para criar
o token de atualização. Então, novamente, são outros métodos
privados, token de atualização de criação privada. E também retorna
um token de atualização. Veja agora, já faz sentido usar o modelo de
token de atualização aqui. E essa coisa agora, é
claro, um novo token de atualização. E aqui nós apenas dizemos
converter token para string base 64, então
bytes de gerador de números aleatórios e, em seguida, 64. E é assim que criamos
nosso token de atualização. Você vê que é simplesmente uma string
de vários caracteres, então nada extravagante como
o JSON Web Token. Este é o nosso token de atualização, e aqui isso será válido
por uma semana e será criado. Agora, no final, retornamos esse token de atualização. Certo? Agora, quando
conseguimos isso, podemos usar esse
método para fazer login. Então, aqui no método de
login depois de criar
o token da Web JSON, agora
podemos dizer que nosso token de atualização é criar um token de atualização. Defina essa coisa aqui, é claro. Então, talvez possamos formatar
isso de forma um pouco diferente. Dizemos que o token de atualização, o token e o token expira, data é o token de atualização expira. Agora salvamos isso e
testamos rapidamente com swagger. Aí estamos nós. Vamos fazer login. Experimente isso, cara, pappa e executa. E lá está ele. Temos nosso token da Web JSON e agora também o token de atualização. Então é assim que essa coisa se parece junto com a data de
exploração. Perfeito. E agora
o próximo passo é armazenar esse token no banco de dados
junto com o usuário e também adicioná-lo a um cookie. Então, vamos fazer isso em seguida.
25. Definir Atualizar Token no Cookie e no banco de dados: Agora, para definir o
token de atualização para um cookie, precisamos da solicitação e do objeto de resposta todo
esse processo
aqui na API da Web. E para poder
acessar essa coisa, precisamos do exercício de
contexto http. Então, queríamos acessar
os contextos HTTP, usaríamos no controlador. Bem aqui. Ele
já estaria disponível aqui. Você já tem
o contexto HTTP. E com isso, você pode
simplesmente acessar a resposta. Por exemplo, semente
aqui cabeçalhos de resposta
e, em seguida, também solicite
cabeçalhos e assim por diante. Então você já pode fazer isso aqui. Mas como queremos
usar o serviço aqui, primeiro
temos que injetar o exercício de contextos
HTTP. Então, vamos fazer isso muito rápido. Aqui em cima, no
construtor, dizemos que eu exercício de contexto HTTP. Vamos chamar isso também de exercício de contexto
http. E novamente, criamos esses campos e um
sublinhado aqui e aqui. E também temos que registrar essa coisa e fazemos isso, talvez
vamos parar
o aplicativo primeiro. Ok, e agora no
programa CS, aqui em baixo, podemos dizer serviços de
construtor e em seguida, adicionar exercícios de contexto HTTP. Esse é o único. Ok, então com isso, temos nosso
acessador de contexto HTTP e registramos essa coisa. E agora podemos criar
nosso método para definir esse token no cookie e
também no banco de dados. Então aqui, novamente,
outro
método privado , Async desta vez, mas não retornamos nada de
atualização token. E essa coisa obtém
os objetos de
token de atualização reais e
, em seguida, também o usuário. Então é disso que precisamos. E agora começamos
com o cookie. E um cookie precisa de opções de
cookies. Então, primeiro, as
opções de cookies, novas opções de cookies. E aqui dizemos que este
é um cookie somente HTTP. Isso significa que ele só pode
ser acessado por meio da solicitação, por meio das chamadas e não via
JavaScript no navegador. Isso é importante. E este é o único lugar
onde precisamos desse cookie. E também podemos definir
o estágio de exploração para atualizar o token expira. Estas já
são as opções de cookies e agora com
os contextos HTTP exercitam, e então pode ser nulo. Então, aqui podemos acessar
os contextos HEB. E a partir disso agora
definimos a resposta. E aqui podemos
acessar os cookies. E aqui acabamos de dizer, apenas
dizemos depende. O valor é chamado de token de
atualização. Em seguida, o token de atualização. Token, esse é o valor. E também damos essa coisa, as opções de cookies,
e é assim que definimos o cookie
em nossa resposta. A próxima coisa agora também
é o usuário. Portanto, o token de atualização do usuário será definido para
atualizar token de token. Em seguida, temos um
token de usuário criado, que é o token de atualização criado. A última coisa que o
token de usuário expira é o
token de atualização expira e,
no final, dizemos contextos de espera
e, em seguida, Salvar alterações assíncronas. Certo? E, novamente, agora
usamos isso em nosso método de login. Aqui em cima. Depois de criarmos
o token de atualização, dizemos definir token de atualização com nossos
objetos de token de atualização e o usuário. Vamos salvar isso e,
novamente, testar essa coisa. Tudo bem, lá
estamos nós. E agora já vamos abrir o console aqui. Como eu quero
mostrar algo na guia do aplicativo, você vê nosso aplicativo atual
localizado sete O oito. Vemos que aqui
podemos acessar os cookies reais,
mas vamos dar uma olhada. Na guia Rede,
tentamos fazer login. Mais uma vez, digamos que com a pimenta do
Homem de Ferro, nós batemos Execute. E você vê o que nós recebemos de volta. E agora aqui primeiro
vemos nos cabeçalhos, na resposta, vemos essa
coisa aqui, definir cookies. Portanto, este é o nosso cookie real, agora está definido como um cookie somente
HTTP. O token de atualização é definido
como um cookie somente HTTP. E agora também podemos encontrar isso na guia
do aplicativo
aqui. Aí está ele. Vamos fazer isso um pouco maior. Talvez tenhamos
o token de atualização de valor e o
token de
atualização de nome. E agora aqui também o valor. E o melhor é
agora que automaticamente essa coisa é
enviada a cada solicitação. Então, se, digamos, por exemplo, você quiser obter isso aqui, diga experimente, ele executa, vá para a guia Rede. É claro que não estamos autorizados, mas vemos que em
nosso cabeçalho de solicitação, envie esse token de atualização. Isso é importante agora
para as próximas etapas porque podemos
definir o token de atualização. Quando criamos um token de atualização, definimos um
token de atualização no cookie e também aqui no banco de dados. Agora podemos ver esse token de atualização
completo. Agora, o próximo passo é bom atualizar o token de atualização e também o JSON Web
Token, é claro, porque o importante aqui com o token de atualização
é que assim que uma Web JSON o token expira
ou alguns segundos ou
minutos antes dele. É responsabilidade
do front-end chamar outros endpoints que permitam ao usuário
atualizar o JWT, o JSON Web Token e
também o token de atualização. E mesmo quando o token
da Web JSON expirou, ele não é mais válido
com
a ajuda do token de atualização
válido por mais tempo, podemos criar um novo token
JWT e uma nova
atualização token para que o usuário ainda seja autenticado e autorizado
e o usuário
não precise se autenticar novamente com o
nome de usuário e a senha. Então, essa é a melhor coisa
do token de atualização. Mas, para isso, precisamos de
outro endpoint onde possamos atualizar o pacote
completo. Então, vamos fazer isso em seguida.
26. Atualizar o Token de atualização (e o Token Web JSON): Mais uma vez, de volta ao Visual Studio. E na interface
criamos esses novos métodos, tarefa fora da resposta DTO. Chamamos esse token de atualização de metanol
também. E não tem nenhum
argumento. Sim, nós reconstruímos, mas
teremos uma flecha, é claro, porque isso não está implementado. Mas vamos fazer isso
agora muito rápido. Implemente a interface, enquanto nossos métodos provavelmente aqui em baixo. Sim, vamos colocar isso. Temos o usuário do registro. Agora vamos descer aqui. Existe nosso método de
token de atualização. Novamente, se você pular o
final da última lição, é importante
que o front-end, front-end, chame essa coisa. Assim que o token
da Web JSON expirar ou pouco
antes ou depois. Em seguida, o front-end tem que
chamar esse endpoint aqui. Bem, este não é o ponto final, este é o método de serviço, mas é claro que o
endpoint será criado no
controlador em um minuto. Mas agora com esse método aqui, podemos atualizar tudo. A primeira coisa que precisamos é desse token de atualização
atual. Então eu já disse que
, a cada solicitação agora, o token de atualização
será enviado com nosso exercício de contexto, exercício de contexto
HTTP. Em seguida, os contextos HTTP. Podemos acessar a solicitação desta vez, não a
resposta às solicitações, e procurar um
determinado valor de cookie, e esse seria
o token de atualização. Depois disso, com o token de
atualização,
tente novamente obter o usuário com
o token de atualização. Então, o usuário var agora Waitz contexta os usuários primeiro
ou assíncrono padrão, onde o token de atualização do usuário agora
é
o token de atualização, o fornecido do cookie. Agora, se você não encontrar o usuário, dizemos retornar nova resposta de
autenticação com a mensagem metanfetamina, token de atualização
inválido. E outra opção, é claro, é se você encontrar um usuário, mas o token do usuário expirou. Portanto, falar expira é
menor que uma data e hora. Agora, neste caso, retornamos novamente uma nova
resposta de autenticação DTO com mensagem. E desta vez
a mensagem simplesmente pode expirar. Nesse caso, o
usuário teria que autenticar novamente com
o nome de usuário e a senha. Mas se tudo for válido, temos um token de usuário ainda
é válido. Mais uma vez, criamos um novo token. Esse é o
token da Web JSON com nosso usuário. Em seguida, criamos um
novo token de atualização. Crie token de atualização. E também defina essa coisa. Defina o token de
atualização, o novo token de atualização e o usuário. No final, retornamos novamente
uma nova resposta do autor, DTO. Com sucesso definido como verdadeiro. O token é o
token, o token de atualização. Novo token de atualização, token. E definimos que o token expira para o novo token de atualização expira, que já era e
deveria ser ele. Mais uma vez muito rápido, esta linha
aqui é realmente importante. Nós pegamos o token de atualização do valor do
cookie somente HTTP. E a partir disso tentamos
encontrar o usuário desta vez, não com o ID do usuário, mas com o token de atualização, porque esse é um token
apenas para um usuário específico. E se você não tiver o usuário, o token de atualização é inválido. Se o token tiver
expirado, então, bem, retornaremos outra mensagem onde o token expirou e o sinalizador de
sucesso é falso. Caso contrário, novamente, definimos o, o JSON Web Token para criar o JSON Web Token
semelhante ao lock-in, criamos um novo token de atualização
e definimos essa coisa e, em seguida, retornamos o pacote completo. Tudo bem, então agora
precisamos dos endpoints. Então, para o nosso controlador, vamos editar aqui talvez. Então, novamente, um HTTP posts com embora um
GET também funcionasse, mas vamos usar uma postagem
aqui e atualizar o token. E o método agora sou preguiçoso, então vamos copiar colar o resultado da ação da
tarefa
e depois uma string. Chamamos isso aqui agora, atualizar token, sem argumentos. E chamamos o token de atualização
sem argumento porque, novamente, o token de atualização vem
com o cookie de solicitação. Se for bem-sucedido,
retornaremos uma resposta OK. Caso contrário,
retornamos solicitações ruins. Bem, eu diria que é hora de
testar isso novamente.
Vamos executar o aplicativo. Tudo bem, aqui estamos nós. Eu removi o cookie aqui
da guia Aplicativo. Como você pode ver, um
cookie está vazio. Não temos um conjunto de token de atualização e também a
guia Rede está vazia. Então, vamos testar isso novamente. Vamos para o login, experimentamos isso com pimenta
Iron Man, por
exemplo, e executamos. Está tudo bem. Recebemos nosso
token da Web JSON, o token de atualização. Também o vemos aqui
no aplicativo uma guia. E agora, quando tento executar o
endpoint do token de atualização aqui ou chamar essa impressão e execução. Isso funciona, obtemos um
novo token de atualização. Você o vê aqui
nas mudanças de valor. Agora, o que acontece? A propósito, é claro,
no banco de dados? Também podemos dar uma olhada. Vamos apenas atualizar isso. Aqui vemos
exatamente o mesmo token. E agora, quando eu removo os nove aqui e clique em Executar, novamente, recebemos a mensagem de
erro correta, token de atualização
inválido, colocá-lo de volta e agora ele funciona. E a data? Temos esse novo
token aqui e vemos que expirar está definido para 16 de maio. Então deixe-me mudar
a data na minha máquina. Mude, defina isso agora para
denotar 20º, talvez mude. Tentei atualizar
o token novamente. Ele diz que o token expirou. Ok, ótimo, então esse
endpoint funciona totalmente. E, novamente, isso é
responsabilidade do front-end. Não posso afirmar isso o suficiente para que o front-end ou
o cliente tenha que verificar. Existe Web Token adjacente que expira ou já expirou. Nesse caso, precisamos pegar
um token de atualização e chamar o endpoint do token de atualização
para obter um novo token de atualização. Tudo bem, e com
isso terminamos com os tokens de atualização e
o último capítulo agora, as estradas e o grande
tópico, autorização.
27. Introdução de Papéis: Agora, esses são os endpoints
agora para o registro, para fazer login, para
o token de atualização. E agora a última parte
deve ser o papel. Temos nosso
objeto de usuário no banco de dados, mas ele não tem nenhuma função ainda. Mas agora isso mudará. Então, o que vamos
fazer a seguir é adicionar a função em uma nova migração. Portanto, esse campo é, então,
no banco de dados, a
função do usuário. E também usaremos as reivindicações para adicionar essa função no
Token da Web JSON. E, em seguida, quando o
usuário tenta chamar um determinado endpoint
e o usuário
precisa ser autorizado
para esse endpoint. Em seguida, podemos verificar isso na API da Web
com outro atributo. Por exemplo, talvez você tenha a função típica de usuário
ou cliente, mas também uma função de
administrador
apenas nos administradores pode chamar determinados endpoints. Então, isso é o que
vamos verificar a seguir.
28. Adicionar função ao modelo de usuário: A primeira coisa,
novamente para nossas funções é adicionar o rolo
ao modelo de usuário e adicionar uma nova migração. Aqui no modelo de usuário, adicionamos uma nova propriedade. Isso seria então uma
string simplesmente com a linha e uma string vazia. Por padrão, salvamos isso e agora executamos
outra migração. Portanto, as migrações dotnet EF
usam linha, por exemplo. Tudo bem, agora vemos essa coisa aqui em nossa pasta de
migrações. Acabamos de adicionar uma nova coluna. Tudo bem. Então, vamos
atualizar o banco de dados com o banco de dados dotnet EF. Agora vamos dar uma olhada. Aqui estão nossos usuários. Atualizamos os dados, vemos a nova linha aqui
e, claro, podemos alterá-la. Por exemplo,
agora podemos dizer que o Irã tem o usuário da linha que pressionamos Aplicar. E se você mudar
algo aqui, certifique-se no navegador de banco de dados para SQL light que você clique
neste botão aqui, certo? Alterações. Agora, essas alterações são
gravadas e salvas. Ok, então esta é agora a nova
função e o modelo de usuário. E, em seguida, adicionamos a
reivindicação da regra S ao token da Web JSON.
29. Adicionar papel como reivindicação ao JSON Web Token: Então, voltamos para
o serviço de autenticação e, em seguida, onde
criamos o token aqui, podemos simplesmente adicionar a
linha agora como uma nova reivindicação. Então, apenas adicionamos uma nova reivindicação e depois os tipos de
reivindicação e depois a linha. Aqui, está sugerindo
já a coisa correta, linha
do usuário, essa é a
única. Já é isso. Portanto, agora já podemos testar
se a função atual
do usuário está disponível
no token da Web JSON. Vamos dar uma olhada. Existe nosso aplicativo. Vamos fazer login novamente. A propósito, se você ainda
estiver bloqueado ou tiver o token de atualização em
seu cookie disponível, poderá usar simplesmente o endpoint do
token de atualização aqui para obter o novo token da Web
JSON. Essa é a melhor coisa
agora com tokens de atualização, você não precisa fazer
login novamente como eu preciso porque removi
tudo dos meus cookies. Portanto, nesse caso, você poderia usar o endpoint de token
Atualizar e obter um novo
Token Web JSON. Você acabou de olhar para dentro. E agora aqui vemos
o token da web JSON. Vamos pegar essa coisa. Dê uma olhada aqui,
nós o colamos novamente. E devemos ver, sim, aí está, o papel agora, que é o usuário. Ótimo, então isso já funciona. Agora, a última etapa já
é que temos que usar essa linha para a
autorização que somente usuários específicos com uma função específica possam
acessar determinados endpoints. Então, vamos fazer isso em seguida.
30. Usar o papel para a autorização: Agora vamos usar a situação
atual. Tentamos obter um novo
JSON Web Token aqui. Isso agora funciona porque
já temos um token de atualização. Novamente, verificamos essa coisa aqui e você vê o usuário da função. Agora vá para o nosso getc chamado
aqui e clique em, Experimente. Você vê por um ou
não está autenticado ou autorizado. Agora adicionamos o token
da Web JSON aqui. Hit Execute, estamos recebendo
aloha, você está autorizado. Mas e se
quisermos apenas que os administradores, por exemplo, usem esse endpoint. Portanto, o administrador da função, por exemplo, podemos mudar isso rapidamente. O controlador desligado. Aqui em cima, vemos onde está lá
não está aqui em cima. Aqui embaixo. Podemos simplesmente adicionar
parênteses rho. Em seguida, administrador, por
exemplo, salvamos isso. Basta reiniciar o aplicativo. Então, agora estamos bloqueados novamente, mas com a ajuda do
nosso token de atualização, obtemos um novo token da Web JSON para que não
precisemos fazer
login manualmente. Vamos autorizar novamente. Pressione Autorizar, fechar. Agora tentamos pegar essa
coisa aqui e conseguimos um 403. Agora 403 Proibido. Então isso significa que enviamos um cabeçalho de
autorização. Enviamos uma chave JSON
Web Token aqui, mas com a linha errada. Agora vamos mudar nossa função aqui
em vez de usuário, agora
dizemos admin, ele se aplica e escreve as alterações. E agora, novamente, vamos
atualizar o token. Tudo bem, então vamos copiar
essa coisa ouvindo novamente. Temos que usar esse token aqui. Agora clicamos em Autorizar e agora 1 sétimo aloha,
você está autorizado. Ótimo. Então, agora, como administrador
com essa função específica, temos permissão para obter essas informações aqui ou
acessar o conteúdo, as informações
desse endpoint. Agora, a última coisa que muitos usuários, muitos alunos perguntam é o que acontece várias funções
quando você tem, quando você quer autorizar
mais varas do que apenas uma. Bem, basta digitar
usuário e depois Admin. E isso também funciona. Vamos reiniciar o aplicativo
manualmente apenas para ter certeza. Agora, quando usamos o
mesmo token aqui, clicamos em Autorizar, ainda funciona. E último teste, digamos novamente, queremos dar a este
usuário, a linha do usuário. Nós escrevemos a mudança. Mais uma vez, obtemos um novo token. Este agora é o
token de usuário que você vê aqui. Agora, esse é um usuário. E clicamos em Autorizar um logout, Berra, fechar, executar, e ainda obtemos o
contrário, você está autorizado. Agora é assim que as estradas funcionam. E com isso,
acabamos com essa aula. Parabéns.
31. Considerações finais: Tudo bem, e é
isso já em pouco tempo você
aprendeu a registrar usuários, bloqueá-los e criar
JSON Web Tokens. Também use tokens de atualização e você adicionou
funções a esse usuário. Então agora eu acho que você já
conhece todos os fundamentos para um
processo de autenticação com dotnet six, eu realmente esperava que você
aprendesse algo e isso fosse útil para você. Se assim for, eu adoraria ver um comentário. Muito obrigado por isso. E talvez você queira
mergulhar mais fundo no dotnet e no blazer e outros funcionários em relação ao desenvolvimento
web. E neste caso, eu
adoraria
vê-lo no meu canal do YouTube. Então, novamente, muito
obrigado pelo seu tempo e obrigado
por se juntar ao meu curso. E espero vê-lo
no próximo curso ou no
meu canal do YouTube. Tome cuidado.