‫Instrutor: Então, aprendemos na última aula
‫que o token JSON da web deve
‫ser armazenado em um cookie seguro somente HTTP.
‫Mas, no momento, estamos apenas enviando
‫o token como uma string simples em nossa resposta JSON.
‫Então, neste vídeo, vamos também enviar o token como um cookie,
‫para que o navegador possa salvá-lo de
‫forma mais segura.
‫Então, estamos em nosso código.
‫Nós realmente enviamos o token para o cliente?
‫Bem, lembre-se, isso está no authController e
‫bem aqui na função createSendToken.
‫Então, antes, tínhamos basicamente todo
‫esse código em muitos lugares diferentes, mas depois
‫refatoramos tudo isso apenas nesta função createSendToken.
‫Tudo bem, então é aqui que vamos trabalhar agora.
‫Agora, tenho certeza de que você
‫está familiarizado com a maneira como os cookies funcionam
‫em geral, mas apenas para ter certeza de que estamos todos na mesma
‫página aqui, vamos falar um pouco sobre cookies.
‫Em primeiro lugar, um cookie é basicamente apenas
‫um pequeno texto que um servidor pode enviar aos clientes.
‫Então, quando o cliente receber um cookie,
‫ele o armazenará automaticamente
‫e o enviará de volta automaticamente
‫junto com todas as solicitações futuras para o mesmo servidor.
‫Tudo bem, então, novamente, um navegador armazena automaticamente um cookie
‫que recebe e o envia de
‫volta em todas as solicitações futuras ao servidor de onde veio.
‫Ok, agora, por enquanto, isso não vai
‫ser muito importante para
‫nós, pois estamos apenas testando a API usando o Postman.
‫Mas um pouco mais tarde, quando vamos renderizar páginas
‫da Web dinâmicas e realmente interagir com
‫o navegador, será muito importante
‫que o navegador envie o token de volta basicamente
‫de forma automática em cada solicitação.
‫Ok, e então, é claro, falaremos mais sobre isso.
‫De qualquer forma, vamos aprender como realmente criar
‫e enviar um cookie.
‫Então, para enviar um cookie, é realmente muito fácil.
‫Tudo o que temos a fazer é basicamente anexá-lo
‫ao objeto de resposta.
‫Portanto, dizemos res. cookie e tudo o
‫que temos que fazer é especificar o
‫nome do cookie, e estou chamando-o
‫de token da web JSON, os dados que realmente queremos
‫enviar no cookie e, portanto, é claro que será
‫a variável de token e depois disso, algumas opções para o cookie.
‫E a primeira opção
‫que vamos especificar é a propriedade expires.
‫Ok, então basicamente, essa propriedade expires
‫fará com que o navegador ou o cliente em
‫geral excluam o cookie depois que ele expirar.
‫Ok, então definimos a data
‫de expiração semelhante àquela que definimos no token da web JSON, ok.
‫Então, vamos criar uma nova variável
‫para isso, ok, porque o pacote de tokens
‫da Web JSON pode funcionar com esse formato.
‫Ok, mas em JavaScript, isso não faz sentido e, em vez
‫disso, vamos criar uma variável com um número real.
‫Então vamos chamá-lo de JWT, então
‫cookie,
‫expira em, e ainda o definimos para 90, então 90 dias,
‫mas novamente, sem o D.
‫Ok, agora podemos fazer operações de
‫verdade com ele porque precisaremos convertê-lo para milissegundos, ok.
‫Então, quando esse cookie deve expirar?
‫Deve expirar em uma nova data.
‫Portanto, em JavaScript, ao especificar
‫datas, sempre precisamos dizer
‫nova data e ela deve expirar agora, mais esses 90 dias.
‫Ok, então agora, assim, é claro.
‫E então processe. env,
‫e agora, vamos usar este e simplesmente
‫colocar o cookie lá, ok.
‫Mas agora, é claro, precisamos converter isso para milissegundos.
‫Portanto, temos 90 dias agora.
‫Então, duas horas, são 24 horas.
‫Dois minutos, são 60.
‫Dois segundos, é 60 vezes novamente.
‫E então para milissegundos, vezes mil, certo.
‫E, claro, eu poderia fazer tudo de
‫uma vez, mas isso é apenas para especificar o que exatamente estamos fazendo.
‫Então, para mostrar
‫que estamos realmente convertendo para milissegundos.
‫A próxima opção será a opção segura.
‫E então vamos definir isso
‫como verdadeiro e assim, o cookie será enviado apenas
‫em uma conexão criptografada.
‫Então, basicamente, estamos usando apenas HTTPS.
‫E, finalmente, é aquela opção httpOnly sobre a qual
‫falamos antes.
‫Ok, então definimos este como verdadeiro
‫e isso fará com que
‫o cookie não possa ser acessado ou modificado de nenhuma forma pelo navegador.
‫Ok, então isso é importante para evitar
‫esses ataques de script entre sites.
‫Tudo bem, então tudo o
‫que o navegador fará quando definirmos httpOnly como
‫true é basicamente receber
‫o cookie, armazená-lo e enviá-lo automaticamente junto com cada solicitação.
‫Ok, e é isso mesmo.
‫É assim que basicamente definimos o cookie, digamos
‫esta parte, e enviamos
‫usando res. biscoito.
‫Agora, se quiséssemos testar isso agora, não funcionaria
‫porque, no momento, não estamos usando HTTPS.
‫E assim, por causa deste seguro: verdadeiro,
‫o cookie não
‫seria criado e nem enviado ao cliente.
‫Tudo bem,
‫basicamente, queremos apenas ativar esta parte aqui na produção.
‫Então, o que vou fazer é
‫basicamente exportar todo esse objeto aqui para uma variável separada.
‫Ok, deixe-me mostrar isso para você.
‫Portanto,
‫const cookieOptions deve ser igual
‫a isso e, aqui, passamos isso.
‫Tudo bem.
‫Agora, é claro, não queremos essa parte aqui,
‫mas apenas quando estivermos em produção.
‫Então, digamos
‫que seja o processo. env. NODE_ENV, lembre-se de que é
‫onde está armazenado, se estivermos em
‫produção ou não.
‫Portanto, se isso
‫for igual à produção, defina cookieOptions. seguro igual a
‫verdadeiro.
‫Ok, e agora, podemos removê-lo daqui.
‫Sim, agora, apenas quando estivermos em
‫produção, teremos as opções seguras definidas como verdadeiras.
‫E caso contrário, só será enviado assim,
‫então apenas com a data de vencimento e httpOnly.
‫Ok, vamos agora realmente testar isso.
‫E vou testá-lo criando um novo usuário.
‫Então, aqui no Sign Up, na verdade,
‫vamos chamá-lo de
‫usuário @ jonas. Io.
‫Sempre com a mesma senha.
‫Vou chamá-lo de usuário
‫também e digamos que a função aqui é um guia, então
‫apenas para que tenhamos algumas funções diferentes aqui também.
‫Dê um pouco mais de espaço.
‫E agora, vamos tentar na verdade.
‫E a resposta é a que esperávamos, com
‫a diferença de
‫que agora temos um cookie aqui nesta guia Cookie.
‫E, de fato, aqui
‫temos o nome do cookie, o valor.
‫Também temos a data de
‫validade, que é exatamente 90 dias a partir de agora.
‫Definimos httpOnly como true e, também, secure definido como false.
‫Tudo bem.
‫Ótimo, também podemos ver todos os cookies que
‫temos aqui nesta guia Cookie.
‫E então, novamente, vemos aquele cookie que
‫recebemos deste domínio, certo.
‫Agora, apenas uma última coisa que eu
‫realmente quero mudar nessa função na qual
‫estamos trabalhando,
‫então o createSendToken, é basicamente me livrar dessa senha aqui na saída.
‫Ok, então em nosso esquema, nós o temos
‫definido para selecionar falso, para que ele não apareça
‫quando consultarmos todos os usuários.
‫Mas, neste caso, vem da criação de um novo documento
‫e isso é diferente e é por isso que o vemos aqui.
‫Ok, mas podemos consertar isso muito facilmente.
‫Ok, então tudo o que precisamos fazer é definir o
‫usuário. senha
‫para indefinido.
‫Tudo bem, e
‫isso deve
‫remover as senhas da saída.
‫OK.
‫Então, vamos deletar este usuário que acabamos de criar.
‫E tente novamente
‫para ver se a senha não aparece mais.
‫E sim, de fato agora, ele se foi.
‫E ainda, nosso cookie, é claro, está aqui.
‫E quando chegamos aqui à nossa guia Cookies, bem,
‫então você ainda tem apenas um cookie
‫porque o antigo agora foi basicamente substituído por este novo
‫e isso é
‫porque eles têm o mesmo nome.
‫Portanto, o nome é como o identificador exclusivo de um cookie.
‫E então, se recebermos um com o
‫nome que já
‫foi dado, bem, então o antigo é simplesmente substituído.
‫Ok, e é isso mesmo.
‫Então é assim que enviamos um cookie somente HTTP
‫e, novamente, falaremos mais sobre
‫isso quando construirmos nosso site dinâmico.