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

yizhihongxing

下面是“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日

相关文章

  • 详解vue+nodejs获取多个表数据的方法

    关于“详解vue+nodejs获取多个表数据的方法”的完整攻略,以下是详细步骤和示例说明。 步骤: 创建一个Vue项目: vue create project_name 安装axios和vue-resource: npm install axios vue-resource –save 在main.js中引入Vue和vue-resource: import…

    node js 2023年6月8日
    00
  • NodeJs测试框架Mocha的安装与使用

    下面我为大家详细讲解“NodeJs测试框架Mocha的安装与使用”的完整攻略。 Mocha简介 Mocha是Node.js的测试框架,它让异步测试更简单更有趣。Mocha测试运行在Node.js和浏览器环境,支持并行测试、异步回调、测试覆盖率以及多种报告格式。Mocha测试框架非常灵活,能够支持各种不同的测试风格和断言库。 安装Mocha 首先需要确保你已经…

    node js 2023年6月8日
    00
  • node.js Sequelize实现单实例字段或批量自增、自减

    Node.js Sequelize是一个基于Javascript的ORM框架,可以轻松地对SQL数据库进行操作。实现自增、自减功能可以通过在模型中定义自增、自减字段,在增加或减少时更新字段值即可。以下是实现“单实例字段自增、自减”的攻略。 单实例字段自增 步骤一:在模型中定义自增字段 通过Sequelize定义模型时,可以添加自增属性。例如,一个用户模型中i…

    node js 2023年6月8日
    00
  • node.js中 redis 的安装和基本操作示例

    下面就为大家介绍一下Node.js中Redis的安装和基本操作。 Redis的安装 在Node.js中使用Redis需要先安装Redis,下面就给大家介绍两种不同的安装方式。 1. 通过官网下载Redis Redis官网的下载地址为:https://redis.io/download,直接进入该网页即可看到Redis的各个版本,我们选择最新的稳定版本进行下载…

    node js 2023年6月8日
    00
  • nodejs+express实现文件上传下载管理网站

    下面是“nodejs+express实现文件上传下载管理网站”的完整攻略。 第一步:初始化项目 首先,需要在本地创建一个空的文件夹,并进入该文件夹: mkdir file-manager cd file-manager 接着,需要使用npm初始化该项目: npm init -y 这将会生成一个package.json文件,用于配置项目信息和依赖项。 第二步:…

    node js 2023年6月8日
    00
  • node运行js获得输出的三种方式示例详解

    关于”node运行js获得输出的三种方式示例详解”,我为您提供以下攻略。 1. Node.js 环境基础 在介绍三种方式之前,需要着重强调Node.js环境的必要性。Node.js环境是指运行JavaScript代码的环境,它是基于Google Chrome V8 引擎构建的一种开源的JavaScript运行环境。要在本机运行JavaScript代码,需要在…

    node js 2023年6月8日
    00
  • 详解使用Nodejs内置加密模块实现对等加密与解密

    下面是详解使用Nodejs内置加密模块实现对等加密与解密的完整攻略。 什么是对等加密? 对等加密,又称对称加密算法,是一种加密与解密使用相同密钥的加密方式。这种加密方式速度快,适用于数据较小的场合。在这种加密方式下,密钥的安全性极为重要,一旦被泄漏可能会导致加密数据不安全。 使用Nodejs内置加密模块实现对等加密 Nodejs中提供了crypto模块,其中…

    node js 2023年6月8日
    00
  • 解读node.js中的path路径模块

    节点(Node.js)的path模块提供了一些有用的函数来管理文件路径。 在本攻略中,我们将讨论这个模块的一些常用函数,以及如何使用它们解析文件路径。 获取文件名 使用path模块可以方便地解析文件名,例如,path.basename()函数可以从文件路径中提取文件名。 const path = require(‘path’); console.log(pa…

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