# :a: Angular 8 * Projeto Node JWT, lista de usuarios, listar, gerar token, Postman para teste * Projeto angular, validação, serviço, template, Router, Modulo > [color=blue] [name=Prof Edson Belém - profedsonbelem@gmail.com] [time=Terca, Jul 28, 2020] > > [color=green] [name=Profa Luciana Medeiros - lucianamedeiros.coti@gmail.com] [time=Terca, Jul 28, 2020] > ## :eye: Estrutura do projeto Node depois de finalizado: ![](https://i.imgur.com/JkGrUCz.png) ### :coffee: User.js ```javascript= const Users = [ { idUsuario: 10, nome: "belem", login: "belem@gmail.com", password: "123456" }, { idUsuario: 11, nome: "lu", login: "lu@gmail.com", password: "123456" }, { idUsuario: 12, nome: "jhansen", login: "jhansen@gmail.com", password: "123456" } ] module.exports = Users ``` ### :coffee: Produtos.ts ```javascript= const Produtos = [{ idProduto: 10, nomeProduto: "havainas", preco: 100, oldimagem: "imagem2", newimagem: "imagem1", }, { idProduto: 11, nomeProduto: "chinelo nike", preco: 20, oldimagem: "imagemnike1", newimagem: "imagemnike2", }, { idProduto: 10, nomeProduto: "mocassim", preco: 20, oldimagem: "imagem2", newimagem: "imagem1", } ] module.exports = Produtos ``` ### :coffee: package.json ```json= { "name": "token", "version": "1.0.0", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "description": "", "dependencies": { "body-parser": "^1.19.0", "cors": "^2.8.5", "express": "^4.17.1", "jsonwebtoken": "^8.5.1" } } ``` ## :warning: Instalar as bibliotecas. Digitar no terminal: ``` npm i ``` ### :coffee: server.js ```javascript= const express = require('express'); const bodyParser = require('body-parser'); const cors = require("cors"); const User = require('./Model/Users'); const Produtos = require('./Model/Produtos'); const app = express(); const jwt = require('jsonwebtoken'); const secret = 'senhasupersecreta' app.use(cors()); app.use(bodyParser.json()); //protegido (function protecao) app.get("/adm/produto", fnValidacao, (req, res, next) => { res.json(Produtos); }) app.post("/auth", function (req, res) { let usu = req.body; let msg = ""; let resp = { "ok": msg }; console.log(usu); let logado = User.filter((res) => { if (res.login == usu.login && res.password == usu.password) { return res; } else { return null; } })[0]; console.log(logado); if (logado) { let token = jwt.sign({ 'login': logado.login }, secret); resp.token = token; console.log(resp.token); } else { res.status(401).json({ msg: 'Usuario ou senha invalidos' }); return } res.json(resp.token); }); function fnValidacao(req, res, next) { let erro = { success: false, msg: 'Erro de autenticacao' }; let authorization = req.headers['authorization']; console.log(authorization); if (authorization) { let token = authorization.split(' ')[1]; console.log('Autorizacao: ', JSON.stringify(authorization)); console.log('Token: ', token); jwt.verify(token, secret, function (err, decoded) { if (err) { console.log('Erro: ', err); res.status(403).json(erro); return; } else { console.log("show"); next(); } }); return; } res.status(401).json(erro); } app.listen(3010, function () { console.log('Servidor iniciado na porta 3010'); }) ``` ## :warning: Iniciar o projeto. Digitar no terminal: ``` node server.js ``` ## :warning: Testar no Postman * **Listar** os produtos sem autenticar. Mostra mensagem de erro pois não passou o **token**. http://localhost:3010/adm/produtos ![](https://i.imgur.com/JZ8maoZ.png) * Para testar o **login**. http://localhost:3010/auth Selecionar POST -> Digitar a URL -> Clicar em BODY -> Clicar em RAW -> Selecionar JSON -> Digitar os dados -> Clicar em SEND ![](https://i.imgur.com/hjcZElQ.png) Resultado. Gerou o token ![](https://i.imgur.com/qtYd5KG.png) :eye: Visualizando no console do Visual Code ![](https://i.imgur.com/K7kNUvx.png) ## :eye: Estrutura do projeto Angular depois de finalizado: ![](https://i.imgur.com/SdeXuu1.png) readme.md ``` localhost:3010/auth localhost:3010/adm/produto ng g c login ng generate module usuario ng g c user ``` ### :a: usuario.ts ```typescript= export class Usuario { idUsuario: number; nome: string; login: string; password: string; token: string = ""; constructor(idUsuario?: number, nome?: string, login?: string, password?: string) { this.idUsuario = idUsuario; this.nome = nome; this.login = login; this.password = password; this.token = ""; } public isLogin() { let regra = /^([a-AA-Z0-9])+@([a-AA-Z0-9])+\.([a-A])+$/ return regra.test(this.login); } public isSenha() { let regra = /^[a-zA-Z0-9]{6,15}$/ return regra.test(this.password); } } ``` ### :a: usuario.service.ts ```typescript= import { Usuario } from '../model/usuario'; import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; const URL = 'http://localhost:3010'; @Injectable() export class UsuarioService { constructor(private http: HttpClient) { } public login(usuario: Usuario): Observable<Usuario> { return this.http.post<Usuario>(`${URL}/auth`, usuario); } } ``` ### :a: user.component.ts ```typescript= import { Component, OnInit } from '@angular/core'; import { UsuarioService } from '../service/usuario.service'; import { Usuario } from '../model/usuario'; import { Router } from '@angular/router'; @Component({ selector: 'app-user', template: `<div> <h1>Login</h1> <hr> <label>Email:</label><br> <input type='text' name='login' [(ngModel)]='usuario.login' id='login' placeholder="Digite seu email"><br> <label>Senha:</label><br> <input type='password' name='password' [(ngModel)]='usuario.password' id='password' placeholder="Digite sua senha"><br> <br> <button (click)='logar();'>Logar</button> </div>` }) export class UserComponent implements OnInit { usuario: Usuario; constructor(private service: UsuarioService, private router: Router) { this.usuario = new Usuario(); } ngOnInit() { } public logar() { this.service.login(this.usuario).subscribe(res => { console.log('logado: ', res); localStorage.setItem('dados', JSON.stringify(this.usuario)); this.router.navigateByUrl('/adm'); }, error => { console.log('erro: ', error); localStorage.setItem('dados', 'error'); this.router.navigateByUrl('/user'); }) } } ``` ### :a: usuario.module.ts ```typescript= import { UsuarioService } from './../service/usuario.service'; import { NgModule, ModuleWithProviders } from '@angular/core'; import { CommonModule } from '@angular/common'; import { UserComponent } from '../user/user.component'; import { FormsModule } from '@angular/forms'; @NgModule({ imports: [ CommonModule, FormsModule ], declarations: [UserComponent], exports: [UserComponent] }) export class UsuarioModule { static forRoot(): ModuleWithProviders { return { ngModule: UsuarioModule, providers: [UsuarioService] } } } ``` ### :a: app.module.ts ```typescript= import { UsuarioService } from './service/usuario.service'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { HttpClientModule } from '@angular/common/http'; import { FormsModule } from '@angular/forms'; import { UsuarioModule } from './usuario/usuario.module'; @NgModule({ declarations: [ AppComponent, ], imports: [ BrowserModule, HttpClientModule, FormsModule, UsuarioModule.forRoot() ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } ``` :::info > [color=blue] [name=Coti Informática - https://www.cotiinformatica.com.br] > > [color=green] [name=Coti EAD - https://www.cotiead.com.br] ::: ###### tags: `angular` `ter-qui` `noite` `10-03-2020`