Angular之jwt令牌身份验证的实现

下面是“Angular之jwt令牌身份验证的实现”的完整攻略:

什么是JWT令牌

JSON Web Token(JWT)是一种轻量级的安全性访问令牌,主要用于在网络应用中传递被授权的信息。JWT由三部分组成,分别是头部、载荷和签名。

  • 头部: 通常由两部分组成,类型和加密算法。
  • 载荷: 所要传递的信息。
  • 签名: 保证信息没有被篡改过。

在服务器端口生成令牌,将其发放给“客户端”,之后该“客户端”每次请求时,可以将该令牌放在请求头中一并发送给服务器端,服务器端通过与令牌签名比较,来验证访问权限。

JWT令牌的优势

与传统的Session/Cookie认证方式不同的是,JWT令牌方案具有以下优势:

  • 自包含性:其本身携带了身份信息,服务端无需存储用户信息。
  • 扩展性:可添加任意数量的自定义字段。
  • 安全性:令牌编码由保密密钥(例如密码学)保护,因此无法篡改。

Angular中使用JWT令牌身份验证的实现

在Angular中使用JWT令牌身份验证,需要在服务端颁发JWT令牌,然后在客户端存储该令牌。每次向API发送请求时,这个令牌都将作为头信息 Authorization 在API中提出。过程如下:

  • 颁发JWT令牌
  • 在客户端存储JWT令牌
  • 向API发送请求,为HTTP头部添加JWT令牌

1. 颁发JWT令牌

在服务端口颁发JWT令牌可以采用如下的方式:

const jwt = require('jsonwebtoken');
const userModel = require('../models/user.model');

const secretKey = 'ThisIsSecretKey';

function validateUser(user) {
    return (user.username === 'admin' && user.password === 'admin');
}

exports.login = function (req, res) {
    // 从请求中获取传递的用户名和密码
    const { username, password } = req.body;

    // 验证用户身份
    const user = { username, password };
    if (validateUser(user)) {
        // 创建并颁发JWT令牌
        const token = jwt.sign({ username: user.username }, secretKey, { expiresIn: '1h' });

        // 以JSON格式向客户端发送响应
        res.json({
            message: 'Login successful',
            token
        });
    } else {
        // 发送身份验证失败信息
        res.status(401).json({
            message: 'Unauthorized'
        });
    }
};

2. 在客户端存储JWT令牌

在Angular应用程序中,可以使用LocalStorage或sessionStorage存储JWT令牌。通过LocalStorage在客户端中存储JWT令牌的示例代码如下:

import { Injectable } from '@angular/core';

const TOKEN_KEY = 'AuthToken';

@Injectable({
  providedIn: 'root'
})
export class TokenStorageService {

  constructor() { }

  signOut(): void {
    window.localStorage.removeItem(TOKEN_KEY);
  }

  public saveToken(token: string): void {
    window.localStorage.removeItem(TOKEN_KEY);
    window.localStorage.setItem(TOKEN_KEY, token);
  }

  public getToken(): string {
    return localStorage.getItem(TOKEN_KEY);
  }
}

3. 向API发送请求,为HTTP头部添加JWT令牌

在Angular应用程序中,可以创建一个AuthInterceptor用于在向API发送请求时,在HTTP头部添加JWT令牌。代码如下:

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
import { TokenStorageService } from './token-storage.service';

const TOKEN_HEADER_KEY = 'Authorization';

@Injectable({
  providedIn: 'root'
})
export class AuthInterceptor implements HttpInterceptor {

  constructor(private token: TokenStorageService) { }

  intercept(req: HttpRequest<any>, next: HttpHandler) {
    let authReq = req;
    const token = this.token.getToken();
    if (token != null) {
      authReq = req.clone({ headers: req.headers.set(TOKEN_HEADER_KEY, 'Bearer ' + token) });
    }
    return next.handle(authReq);
  }
}

最后,在Angular模块中添加AuthInterceptor服务以确保HTTP请求成功携带JWT令牌。代码如下:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';
import { AuthInterceptor } from './auth.interceptor';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule
  ],
  providers: [{
    provide: HTTP_INTERCEPTORS,
    useClass: AuthInterceptor,
    multi: true
  }],
  bootstrap: [AppComponent]
})
export class AppModule { }

以上即是“Angular之jwt令牌身份验证的实现”的完整攻略,希望能给您带来一些帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Angular之jwt令牌身份验证的实现 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 详解axios在node.js中的post使用

    详解axios在node.js中的post使用攻略 什么是axios? axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。它支持请求和响应拦截、转换请求数据和响应数据、自动转换 JSON 数据、取消请求等一系列常用功能。 安装axios 在 node.js 中使用 axios,需要通过 npm 安装 axios,…

    node js 2023年6月8日
    00
  • Vue.js项目部署到服务器的详细步骤

    下面来详细讲解“Vue.js项目部署到服务器的详细步骤”。 1. 前置条件 在进行 Vue.js 项目部署之前,需要在服务器上安装 Node.js 和 Git 工具。如果你的服务器已经安装过了,那么可以跳过此步骤。 安装 Node.js: # 安装 Node.js sudo apt-get update sudo apt-get install nodejs…

    node js 2023年6月8日
    00
  • node.js入门学习之url模块

    Node.js入门学习之url模块 什么是url模块? url模块是Node.js标准库中的一个模块,主要用于处理和解析URL地址。 如何使用url模块? 要使用url模块,首先需要使用require方法引入: const url = require(‘url’); 然后就可以使用url模块提供的方法了。 url.parse方法 url.parse()方法用…

    node js 2023年6月8日
    00
  • 详解用Node.js实现Restful风格webservice

    详解用Node.js实现Restful风格webservice 在本文中,我们将详细讲解如何使用Node.js实现Restful风格的webservice。Node.js是一个基于Chrome的JavaScript运行环境,可以使用JavaScript开发服务器端应用程序。Restful风格的webservice是一种基于HTTP通信协议,使用Web标准来提…

    node js 2023年6月8日
    00
  • node里的filesystem模块文件读写操作详解

    Node.js中文件读写操作详解 在Node.js中,可以使用fs模块进行文件系统相关的操作,如文件读写、目录操作等。 读取文件 使用fs.readFile()方法可以读取文件的内容,该方法的参数为文件路径和回调函数,回调函数的参数包含了错误信息和文件内容。 示例1:读取文本文件 const fs = require(‘fs’); fs.readFile(‘…

    node js 2023年6月8日
    00
  • 最新版React Native环境搭建(亲测)

    最新版React Native环境搭建(亲测) React Native 是 Facebook 发布的用于开发跨平台移动应用的框架,它能够让开发者使用 JavaScript 进行原生应用开发。本文将介绍在最新版的 React Native 中,如何搭建开发环境。 第一步:安装 Node.js React Native 是基于 Node.js 运行的,因此需要…

    node js 2023年6月9日
    00
  • 浅谈Nodejs中的作用域问题

    浅谈Node.js中的作用域问题 作用域是编程中一个非常重要的概念,它定义了变量和函数的可访问性。Node.js在处理作用域问题时也有自己的特点。 作用域 在Node.js中,作用域分为全局作用域和函数作用域两种。 全局作用域中定义的变量可以在整个程序中被访问到,例如: var a = 10; function test() { console.log(a)…

    node js 2023年6月8日
    00
  • vue-element-admin开发教程(v4.0.0之前)

    《Vue Element Admin》是一个开源的基于Vue和Element的后台管理系统解决方案,它通过提供数据表格、表单、图表等组件,大大提高了前端开发效率。本文将提供vue-element-admin开发教程(v4.0.0之前)的完整攻略。 环境搭建 在开始使用vue-element-admin开发前,需要环境的搭建。建议使用最新版本的Node.js和…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部