如何基于JWT实现接口的授权访问详解

基于JWT实现接口的授权访问详解攻略如下。

JWT简介

JWT (JSON Web Token) 是一种用于进行身份认证的开放标准(RFC 7519)。JWT由三部分组成:Header、Payload 和 Signature。其中,Payload 用于存储要传递的信息,可以包括用户 ID、角色等信息。Header 使用 Base64 编码存储,表示使用的算法、类型等信息。Signature 用于验证用户的授权信息。

使用 JWT 进行身份认证时,服务端在用户登录时签发一个 JWT,用户将该JWT在之后的 API 调用中附加到请求的头部 Authorization 中,服务端在接收到请求后会验证 JWT 的有效性,从而实现对用户身份的验证。

接下来我们将详细说明如何实现基于JWT的接口授权访问。

生成 JWT

服务端在用户登录时,需要生成一个包含用户信息的JWT,以做为后续接口请求的凭证。具体代码可以参考以下示例。

const jwt = require('jsonwebtoken');

const SECRET_KEY = 'your_secret_key';

// 用户登录成功后生成JWT
function generateToken(user) {
  const payload = {
    userId: user.id,
    username: user.username,
    role: user.role,
  };
  return jwt.sign(payload, SECRET_KEY, {
    expiresIn: '1h', // 有效期为1小时
  });
}

在上述代码中,我们使用jsonwebtoken的sign()函数生成JWT。其中,payload 参数包含要存储的信息,SECRET_KEY 用于生成 Signature,expiresIn 表示 JWT 有效期为1小时。

解析 JWT

在服务端收到API请求时,需要对请求头部中携带的 JWT 进行解析和验证。具体代码可以参考以下示例。

const jwt = require('jsonwebtoken');

const SECRET_KEY = 'your_secret_key';

// 解析JWT
function verifyToken(req, res, next) {
  const authHeader = req.headers.authorization;

  if (!authHeader) {
    return res.status(401).json({ message: 'Missing Authorization Header' });
  }

  const token = authHeader.split(' ')[1];

  try {
    const decoded = jwt.verify(token, SECRET_KEY);
    req.user = decoded;
    next();
  } catch (err) {
    return res.status(401).json({ message: 'Invalid Token' });
  }
}

在上述代码中,我们从请求头部中获取 JWT(header.Authorization),然后使用jsonwebtoken的verify()函数进行解析验证。如果验证通过,则将解析后的信息存储到req.user中,并调用next()继续处理请求;如果验证不通过,则返回401。

示例一:Express实现JWT授权访问

接下来,我们使用Express框架实现JWT授权访问。

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();
const SECRET_KEY = 'your_secret_key';

function generateToken(user) {
  const payload = {
    userId: user.id,
    username: user.username,
    role: user.role,
  };
  return jwt.sign(payload, SECRET_KEY, {
    expiresIn: '1h',
  });
}

function verifyToken(req, res, next) {
  const authHeader = req.headers.authorization;

  if (!authHeader) {
    return res.status(401).json({ message: 'Missing Authorization Header' });
  }

  const token = authHeader.split(' ')[1];

  try {
    const decoded = jwt.verify(token, SECRET_KEY);
    req.user = decoded;
    next();
  } catch (err) {
    return res.status(401).json({ message: 'Invalid Token' });
  }
}

// 用户登录接口
app.post('/login', (req, res) => {
  // 根据用户名和密码进行身份验证,省略验证代码
  const user = {
    id: 1,
    username: 'admin',
    role: 'admin',
  };
  const token = generateToken(user);
  res.json({ token });
});

// 获取用户信息接口
app.get('/user', verifyToken, (req, res) => {
  res.json({ user: req.user });
});

app.listen(3000, () => console.log('Server is running'));

在上述代码中,我们定义了两个接口:/login 用来生成JWT,/user 用来获取当前登录用户的信息。

用户登录时,服务端生成 JWT 并返回给用户,用户在调用 /user 接口时将携带该JWT,服务端会在 verifyToken() 中对JWT进行验证,如果验证通过,则在 req.user 中存放解析后的用户信息,然后将用户信息返回给用户。

示例二:Koa实现JWT授权访问

接下来,我们使用Koa框架实现JWT授权访问。

const Koa = require('koa');
const Router = require('@koa/router');
const jwt = require('jsonwebtoken');

const app = new Koa();
const router = new Router();
const SECRET_KEY = 'your_secret_key';

function generateToken(user) {
  const payload = {
    userId: user.id,
    username: user.username,
    role: user.role,
  };
  return jwt.sign(payload, SECRET_KEY, {
    expiresIn: '1h',
  });
}

function verifyToken(ctx, next) {
  const authHeader = ctx.headers.authorization;

  if (!authHeader) {
    ctx.throw(401, 'Missing Authorization Header');
  }

  const token = authHeader.split(' ')[1];

  try {
    const decoded = jwt.verify(token, SECRET_KEY);
    ctx.user = decoded;
    return next();
  } catch (err) {
    ctx.throw(401, 'Invalid Token');
  }
}

// 用户登录接口
router.post('/login', (ctx) => {
  // 根据用户名和密码进行身份验证,省略验证代码
  const user = {
    id: 1,
    username: 'admin',
    role: 'admin',
  };
  const token = generateToken(user);
  ctx.body = { token };
});

// 获取用户信息接口
router.get('/user', verifyToken, (ctx) => {
  ctx.body = { user: ctx.user };
});

app.use(router.routes());
app.listen(3000, () => console.log('Server is running'));

在上述代码中,我们定义了两个接口:/login 用来生成JWT,/user 用来获取当前登录用户的信息。

用户登录时,服务端生成 JWT 并返回给用户,用户在调用 /user 接口时将携带该JWT,服务端会在 verifyToken() 中对JWT进行验证,如果验证通过,则在 ctx.user 中存放解析后的用户信息,然后将用户信息返回给用户。

以上是关于“如何基于JWT实现接口的授权访问详解”的完整攻略,希望可以帮助你了解JWT身份验证的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何基于JWT实现接口的授权访问详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • EasyUI框架 使用Ajax提交注册信息的实现代码

    接下来我将详细讲解“EasyUI框架 使用Ajax提交注册信息的实现代码”的完整攻略。 首先,我们需要在我们的网页中引入EasyUI框架的JavaScript和CSS文件,可以使用以下链接引入: <link rel="stylesheet" type="text/css" href="https://c…

    Java 2023年5月20日
    00
  • 微信小程序模板template简单用法示例

    微信小程序模板template简单用法示例 什么是小程序模板? 小程序模板是一种可复用的代码结构,可以在多个页面中使用。它包含了一些 HTML、CSS、JavaScript 代码,用于渲染页面元素。 如何使用小程序模板? 在微信小程序中,使用小程序模板需要遵循以下步骤: 在 *.wxml 文件中引入模板:使用 wxml 标签的 import 属性,将需要引入…

    Java 2023年5月23日
    00
  • Springboot mybatis常见配置问题解决

    下面是Springboot MyBatis常见配置问题解决的完整攻略。 问题一:MyBatis的Mapper不能正常映射数据库表 原因 由于 Mapper 文件和数据库表的对应关系没有处理好,MyBatis 执行时会找不到对应的表或列,导致不能正常映射。 解决方案 确认数据库配置是否正确,包括数据库名称、端口、用户名、密码等。 确认 Mapper 文件的命名…

    Java 2023年5月20日
    00
  • Java中通过Class类获取Class对象的方法详解

    Java中通过Class类获取Class对象的方法详解 在Java编程中,我们常常需要获取某个类的Class对象。获取Class对象的主要方法有以下几种: 使用Class.forName()方法 Class.forName()方法根据传入的类名返回对应的Class对象。 java Class<?> clazz = Class.forName(“j…

    Java 2023年5月26日
    00
  • Java之JSP教程九大内置对象详解(中篇)

    让我来详细讲解一下“Java之JSP教程九大内置对象详解(中篇)”的完整攻略。 一、介绍 本教程将深入讲解九大内置对象,包括:request、response、pageContext、session、application、out、config、page、exception。通过本教程的学习,你将深入了解这些内置对象的作用和使用方法,进一步提高你的JSP编程…

    Java 2023年5月26日
    00
  • java实现简单的小超市程序

    Java实现简单的小超市程序攻略 需求分析 在实现小超市程序之前,我们需要了解程序的需求。假设我们需要实现以下功能: 商品信息的录入和展示 商品的购买和结算 支持会员折扣和促销活动 设计思路 在了解需求之后,我们再来规划一下小超市程序的设计思路。 商品实体类 首先我们需要设计一个商品的实体类,包括商品名称、单价、库存、条形码等属性。 超市类 我们还需要设计一…

    Java 2023年5月18日
    00
  • Java中的Error有哪些?

    当我们在Java程序中遇到某些无法处理的错误或异常时,Java运行时会抛出一个Error对象,通常我们需要对其进行处理或捕获。在Java中,Error对象通常指的是那些阻止程序正常工作的严重错误或问题。下面是Java中Error的一些常见类型及其说明。 1. OutOfMemoryError OutOfMemoryError指的是程序在尝试使用更多内存时无法…

    Java 2023年4月27日
    00
  • Jsp+Servlet实现购物车功能

    一、Jsp+Servlet实现购物车功能简介 Jsp和Servlet结合使用,可以完美地实现购物车功能。购物车功能是电商网站中的重要部分之一,它允许购物者把想要购买的物品添加到购物车中,可以随时查看、删除和购买。 二、实现购物车功能的具体步骤 确定购物车存储的数据结构 购物车应该存储哪些信息?一般来说,购物车需要存储商品的数量、单价、总价、商品名称、图片等信…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部