Openresty(十五)通过lua实现令牌校验

一    模块地址

(1)插件安装

+++++++++++++"安装方式"+++++++++++++

1.opm安装  -->'默认'安装的位置

opm get SkyLothar/lua-resty-jwt

2.源码安装,进行copy  -->'不建议'

参考博客 

网关权限控制

(2)常用方法介绍

①  sign

功能: 生成'jwt token'

备注: 无法设置'token的有效期',仅仅'作为测试'

说明: 可以通过'高级语言'的代码在生成'token'设置'expire、issuers'

变相: openresty 的jwt插件并没有提供'时间过期'的校验,可以通过将'token'存到cookies中变相的增加'生命时间'

②    verify

核心:关注'成功'和'失败'的jwt_obj

③    claim_spec常用选项

说明:该选项是一个'lua table'

④    sign-jwe

二    实现

 

需求: 验证通过,允许用户'查询数据',暂时不涉及'openresty的请求阶段的access'

 (1) 安装jwt插件

(2)lua高效实现

①    生成token

备注:生产最好存储在'localStorage'本地存储中

②    进行token校验

1)成功

2)key密钥错误导致失败

说明:获取最好是payload字段

3)token过期导致失败

说明: '30s'有效期

注意: '时间'的问题 -->'差8h'

 4)base编码问题

  

Django时间Field与datetime与time解读

Django - 日期、时间字段

(3)生产场景使用

①  check.lua 模块

②  nginx.conf配置

#  openresty作为各种service的api网关

location /service1 {
     # 核心是-->access_by_lua
     access_by_lua '
     local jwt = require("lua.check")
     jwt.auth()';
     default_type application/json;
     proxy_pass http://tomcat;
}

③    关键字状态码 

ngx.OK,                    -->"200"

ngx.ERROR,                 -->"500"

ngx.HTTP_NOT_FOUND,        -->"404"

ngx.HTTP_MOVED_TEMPORARILY -->"302"

ngx.HTTP_UNAUTHORIZED      -->"401"

++++++++++++++++++"其它方式"++++++++++++++++++

return  401 "认证不通过"

ngx.status = 401

openresty找不到静态文件

Java实现token的生成与验证-登录功能

③④⑤⑥

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Lua实现拦截请求校验sign可以通过OpenResty实现OpenResty是一个基于Nginx的Web应用开发框架,支持使用Lua脚本进行二次开发。以下是一个简单的示例,实现了拦截请求并校验sign的功能: ``` -- 导入OpenResty的http库 local http = require "resty.http" -- 获取请求的URI和query参数 local uri = ngx.var.uri local args = ngx.req.get_uri_args() -- 获取请求头中的sign参数 local sign = ngx.req.get_headers()["sign"] -- 根据请求参数生成待校验的签名 local signParam = "" for k, v in pairs(args) do signParam = signParam .. k .. "=" .. v .. "&" end signParam = string.sub(signParam, 1, -2) local signToCheck = ngx.md5(signParam) -- 校验签名是否正确 if sign ~= signToCheck then ngx.exit(ngx.HTTP_FORBIDDEN) end -- 发送请求到后端服务 local httpc = http.new() local res, err = httpc:request_uri("http://backend_service" .. uri, { method = ngx.req.get_method(), headers = ngx.req.get_headers(), body = ngx.req.get_body_data(), keepalive_timeout = 60000, keepalive_pool = 10 }) -- 将后端服务的响应返回给客户端 ngx.status = res.status ngx.say(res.body) ngx.exit(ngx.HTTP_OK) ``` 以上代码中,首先获取请求的URI和query参数,并获取请求头中的sign参数。然后根据请求参数生成待校验的签名,使用ngx.md5函数计算签名的MD5值。最后,校验签名是否正确,如果不正确则直接返回HTTP_FORBIDDEN状态码。如果签名校验通过,则使用resty.http库发送请求到后端服务,并将响应返回给客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值