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日

相关文章

  • 一行命令搞定node.js 版本升级

    一行命令搞定node.js版本升级,可以使用nvm(Node Version Manager),它可以方便的在不同版本之间切换,并且不需要使用sudo命令获取root权限。下面是该攻略的完整过程: 安装nvm 要使用nvm,需要先安装它。可以使用curl或wget命令来下载安装脚本,随后使用bash命令安装。 $ curl -o- https://raw.g…

    node js 2023年6月8日
    00
  • NodeJS学习笔记之Module的简介

    下面是我对于“NodeJS学习笔记之Module的简介”的攻略说明: 什么是Module 在NodeJS中,Module(模块)是一个独立的文件作用域,可以包含代码、函数、变量等内容。Module 具备了封装性、重用性和依赖性,让我们能够更好地组织有意义的代码。 模块的导入和导出 要使用一个模块内容,我们需要先了解如何导入它。在 NodeJS 中,采用 re…

    node js 2023年6月8日
    00
  • 使用GruntJS构建Web程序之Tasks(任务)篇

    使用GruntJS构建Web程序之Tasks(任务)篇 在 GruntJS 中,任务(Tasks)是指一组执行一些特定的工作的命令。GruntJS 提供了很多内置的任务,比如文件的复制、合并、压缩等等,同时也支持使用插件编写自定义任务。在本篇中,我们将深入学习 GruntJS 的任务相关知识。 任务的定义 下面是一个使用 GruntJS 定义任务的示例: m…

    node js 2023年6月8日
    00
  • Node.js的项目构建工具Grunt的安装与配置教程

    下面为大家详细讲解“Node.js的项目构建工具Grunt的安装与配置教程”的完整攻略。 一、Grunt是什么 Grunt是一款基于Node.js的项目构建工具,可以自动化执行一些常见的任务,例如对CSS、JavaScript等文件进行打包、压缩、合并、校验等操作,从而提高开发效率。 二、安装Grunt Grunt依赖于Node.js和npm包管理工具,因此…

    node js 2023年6月8日
    00
  • nodejs中全局变量的实例解析

    下面我将详细讲解“nodejs中全局变量的实例解析”的完整攻略。 什么是全局变量 Node.js中的全局变量是指可以在程序的任何位置访问的变量。在Node.js中,有两种类型的全局变量: 全局对象属性 全局作用域属性 全局对象属性 Node.js中的全局对象是global对象,他包含了Node.js的所有全局属性,如console、process、Buffe…

    node js 2023年6月8日
    00
  • 详解Nodejs之npm&package.json

    详解 Node.js 之 npm & package.json 的攻略如下: 什么是 npm? npm 是 Node.js 的包管理器,它使 Node.js 社区中的开发者可以发布、共享和重用代码。 什么是 package.json? package.json 是一个 JSON 格式的文本文件,其中包含了项目的元数据(如:名称、版本、许可证等)、依赖…

    node js 2023年6月8日
    00
  • Vue 响应式系统依赖收集过程原理解析

    Vue响应式系统是指Vue通过监控数据对象的变化状态来自动响应视图变化的系统。主要包括数据响应式绑定及依赖收集。其中,依赖收集是Vue响应式系统的重要部分。本文将对Vue响应式系统依赖收集过程的原理进行解析。 为何需要依赖收集 在编写Vue程序时,我们经常需要使用Vue的数据绑定功能。数据绑定实现数据驱动页面渲染,但是Vue并不知道实际的DOM结构和Java…

    node js 2023年6月8日
    00
  • Nodejs抓取html页面内容(推荐)

    Node.js 是一个用于编写高效且可扩展的网络应用程序的跨平台 JavaScript 运行时环境。它使用事件驱动、非阻塞 I/O 模型,使其轻松处理大量并发连接。在Node.js中,抓取HTML页面内容可以使用request和Cheerio两个库来实现。 安装依赖库 在使用Node.js抓取HTML页面内容之前,需要先安装所需的依赖库,即request和C…

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