对于微服务网关来说,统一请求验证是一个比较重要和常用的功能,通过网关验证后台服务就无须关注请求验证;对于多语言平台的服务而言制定验证方式和变更验证配置都是一件比较繁琐和工作量大的事情。Bumblebee
提供JWT
验证插件,只需要简单配置即可让网关实现请求统一验证。
引用插件
Bumblebee
中使用JWT
需要引用两个插件,分别是Bumblebee.Configuration
和Bumblebee.Jwt
。加载启动后就可以通过管理工具进行插件配置.
g = new Gateway(); g.HttpOptions( o => { o.Port = 80; o.LogToConsole = true; o.LogLevel = BeetleX.EventArgs.LogType.Error; }); g.Open(); g.LoadPlugin( typeof(Bumblebee.Configuration.Management).Assembly, typeof(Bumblebee.Jwt.JwtPlugin).Assembly );
如果不想自己编写代码可以下载编译的运行包 Bumblebee1.0.6这个版本已经加入了JWT
插件管理
运行程序后进行配置管理工具的插件管理页面,可以看到JWT
插件,默认是未启用。
数据库配置
Bumblebee.Jwt
的使用需要用到数据库,主要用于接管登陆并生成Token
用。插件默认支持三种数据库,分别是:mssql
,mysql
和pgsql
.相关登陆信息表必须包括以下三个字段:_name
(用户名),_role
(角色)和_password
(密码).mysql脚本如下:
CREATE TABLE `_users` ( `_name` varchar(50) NOT NULL, `_password` varchar(45) DEFAULT NULL, `_role` varchar(45) DEFAULT NULL, PRIMARY KEY (`_name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
JWT配置
插件使用需要进行配置,可以通过点击插件进入相关配置页面。
示例配置如下:
{ "Key": "ExxUqmeDKnAk1eMHV02ICJkwp82RsleM887yRnQS3Gg8OHCxWsLPlzCEAJActCo6y6Mae26JeGDFx7aYkeP7Efl6yh/d1q3XYRCdDLLGbz+kt3vR92H6s78P7JILNgZMiO6XoekKXfT2Qxle7Gyu/1d39NloKhqXgBdgzeobyyo=", "MD5": false, "DBType": "MYSQL", "ConnectionString": "Server=192.168.2.19;Database=world;Uid=root;Pwd=123456;", "VerifyPaths": [ "^/api.*" ], "Table": "_users", "TokenTimeOut": 200, "RemoveHeaders": [ "Cookie" ], "LoginMaxRps": 200 }
-
Key
JWT处理密钥 -
MD5
是否要把密码转MD5再查询 -
DBType
数据类型,分别:MSSQL,MYSQL,PGSQL -
ConnectionString
数据库连接字符串 -
VerifyPaths
需要验证的路径列表,正则表达式。 -
Table
用户表名称 -
TokenTimeOut
凭证超时时间,单位是分钟 -
RemoveHeaders
转发时移走头列表 -
LoginMaxRps
登陆限制,每秒允许并发数,如果设置成零则不限.使用中建议设置一个并发限制,毕竟这个操作涉及到数据库IO处理,容易被恶意调用损耗网关性能。
JWT相关访问接口
-
http://host/__system/jwt/login?name=henry&pwd=123456&cookie=true
登陆获取Token
访问Url,cookie
参数表示返回Token
并写入Cookie
-
http://host/__system/jwt/singout
清除Cookie
相应的Token
信息.
请求Token配置
如果在调用登陆的时候写入了Cookie
那在请求过程中不再需要配置相关Token
信息.在其他调用方式下需要把返回的Token
配置到请求头的Authorization
上。
应用示例
直接下来用aspcore
编写一个webapi
服务然后用Bumblebee
进行一个代理并设置安全控制访问。
public class ApiController : Controller { // GET: // public IActionResult Index() { return new ContentResult { Content = $"{DateTime.Now}|name:{Request.Headers["jwt_user"]};role:{Request.Headers["jwt_role"]}" }; } public IActionResult Hello(string name) { return new ContentResult { Content = $"hello {name} {DateTime.Now}|name:{Request.Headers["jwt_user"]};role:{Request.Headers["jwt_role"]}" }; } }
服务启动的地址是http://localhost:58387/
,在网关配置相关路由
当JWT
验证关闭后可以正常访问服务
由于没有经过网关的验证,所以jwt_user
和jwt_role
信息为空。如果开启JWT
验证又会怎样呢?
下面是开启的运行结果
由于请求没有凭证信息,所以被网关拦截并返回了相应的错误。接下来先访问一下登陆接口并获取凭证http://localhost/__system/jwt/login?name=henry&pwd=123456&cookie=true
,当凭证获取后就可以访问服务。
返回的结果可以正常获取jwt_user
和jwt_role
信息,因为网关开启jwt后把相关登陆凭让写入到相关信息头传入到相应的服务中。