开源网关Apache APISIX启用JWT身份验证

说明:

创建最小API

首先,确保你已经安装了.NET 6 SDK。创建文件夹"MinimalApiDemo",VS Code打开文件夹,打开终端

powershell 复制代码
dotnet new web -o MinimalApiDemo
cd MinimalApiDemo

修改Program.cs

cs 复制代码
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

builder.WebHost.UseUrls("http://0.0.0.0:5001");

app.MapGet("/", () => "Hello, World!");

app.MapGet("/protect/{name}", (string name) => $"Hello, {name}!");

app.Run();

启动项目

powershell 复制代码
dotnet run

浏览器打开"http://192.168.8.220:5001/protect/tom",显示结果

plaintext 复制代码
Hello, tom!

创建消费者

创建两个消费者,管理员admin和用户user

json 复制代码
{
  "username": "admin_role",
  "plugins": {
    "jwt-auth": {
      "exp": 86400,
      "key": "admin",
      "secret": "admin1234567890"
    }
  }
}
json 复制代码
{
  "username": "user_role",
  "plugins": {
    "jwt-auth": {
      "exp": 86400,
      "key": "user",
      "secret": "user1234567890"
    }
  }
}

创建上游

创建公共API端点

为JWT身份验证创建公共API端点/apisix/plugin/jwt/sign​

json 复制代码
{
  "uri": "/gen_token",
  "name": "jwttoken",
  "plugins": {
    "public-api": {
      "uri": "/apisix/plugin/jwt/sign"
    }
  },
  "status": 1
}

浏览器或者Postman等工具,请求如下链接,注意这里的key为admin

plaintext 复制代码
http://192.168.8.249:9080/gen_token?key=admin

得到admin的token

plaintext 复制代码
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJhZG1pbiIsImV4cCI6MTcxNzc2ODcwNH0.YeuyvRJmRHwajqmFm6G8ffYtguIW4PFoZ7LY3iDO8Kg

同理,接下来使用key为user

plaintext 复制代码
http://192.168.8.249:9080/gen_token?key=user

得到user的token

plaintext 复制代码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyIiwiZXhwIjoxNzE3NzY4ODc0fQ.ZSpDGNmBHVjoKtLxxic6S5C4auNJx1FlAJThvJReq6k

创建测试路由

测试之前的最小API接口

json 复制代码
http://192.168.8.220:5001/protect/tom

【更多】【查看】的内容如下

json 复制代码
{
  "uri": "/protect/*",
  "name": "protect",
  "methods": [
    "GET"
  ],
  "plugins": {
    "consumer-restriction": {
      "whitelist": [
        "admin_role"
      ]
    },
    "jwt-auth": {}
  },
  "upstream_id": "516993931985027773",
  "status": 1
}

测试JWT认证

使用Postman工具,访问如下接口

plaintext 复制代码
http://192.168.8.249:9080/protect/tom

Postman提示

json 复制代码
{"message":"Missing JWT token in request"}

Headers中Key填写"Authorization",Value填写"Bearer token"(注意Bearer和token之间有一个空格)

使用user的token

plaintext 复制代码
Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1c2VyIiwiZXhwIjoxNzE3NzY4ODc0fQ.ZSpDGNmBHVjoKtLxxic6S5C4auNJx1FlAJThvJReq6k

Postman提示如下。网关阻止了user用户请求

json 复制代码
{"message":"The consumer_name is forbidden."}

接下来使用admin的token

json 复制代码
Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJhZG1pbiIsImV4cCI6MTcxNzc2ODcwNH0.YeuyvRJmRHwajqmFm6G8ffYtguIW4PFoZ7LY3iDO8Kg

admin用户顺序访问受保护的接口

参考

‍

相关推荐
岁月宁静1 天前
一个 AI 项目从本地到上线,要经过哪些步骤?全流程讲清楚
python·docker·agent
每天一道题1 天前
CAP、Raft 与多数派:分布式系统如何达成一致?
分布式·后端·微服务
正经教主1 天前
【FDE系列】阶段2:Day 42(UP详细版):Dockerfile 实战 — 把你的应用打包成镜像
人工智能·docker·fde
刘马想放假1 天前
Copyparty 轻量文件共享:Docker Compose 部署、权限与多协议使用全指南
docker·容器
岁寒良木1 天前
麒麟 V10 (x86_64) 离线/联网部署 Docker 26.1.4 与 MaxKB v2.10 LTS 实战指南
python·docker·kylin
FungLeo1 天前
成为全栈·Go 后端篇·跨语言认证兼容:Node 与 Go 如何互认 JWT 和密码
golang·go·jwt·身份认证·成为全栈·bcrypt
正经教主1 天前
【FDE系列】阶段2:Day 43(UP详细版):Docker Compose — 多容器一键编排
运维·docker·容器
csdn_aspnet1 天前
构建、运行与管理容器的 18 个常用 Docker 命令
docker·容器·eureka·command
weixin_177297220691 天前
二手旧物回收小程序先要解决的不是下单,是“上门之后价格变了怎么办“
小程序·apache
木雷坞1 天前
AnythingLLM Docker部署:中文资料上传后无引用的检查路径
运维·docker·容器