jwt在nginx lua中的使用

时间:2024-04-04 16:50:50

Nginx是一个Web服务器,也可以用作反向代理,负载平衡器,邮件代理和HTTP缓存。Nginx可用于创建一个API网关,该API网关以事件驱动的方式处理请求,并以快速,资源占用少的方式处理对服务器的查询。此外,它还降低了复杂性并通过降低性能来最大化性能提供API调用的平均响应时间。

我们大多数人都已经熟悉Kong,探索使用OpenResty构建API网关的可能性。

我们需要做的第一件事是安装openresty。OpenResty使我们能够使用Lua编写Nginx脚本。

安装完成后,您应该导航到浏览器并输入http://localhost。如果一切顺利,您将看到以下屏幕截图:

jwt在nginx lua中的使用

 

对于基本的API网关,应执行两个重要操作:

  1. 路由
  2. 认证方式

jwt在nginx lua中的使用

路由

要将端点路由到其各自的服务器:

local /api/ test {
proxy_pass http:// localhost:8080/api/test;
}

认证方式

为了执行身份验证,我将使用JWT。为此,我们需要使用OPM(OpenResty Package Manager)安装lua-resty-jwt库。

opm get SkyLothar/lua-resty-jwt

创建一个jwt-auth.lua文件

local jwt = require “resty.jwt”
local validators = require “resty.jwt-validators”if ngx.var.request_method ~= “OPTIONS” and not string.match(ngx.var.uri, “login”) then
  local jwtToken = ngx.var.http_Authorizationif jwtToken == nil then
 ngx.status = ngx.HTTP_UNAUTHORIZED
 ngx.header.content_type = “application/json; charset=utf-8”
 ngx.say(“{\”error\”: \”Forbidden\”}”)
 ngx.exit(ngx.HTTP_UNAUTHORIZED)
 endlocal claim_spec = {
 exp = validators.is_not_expired()// To check expiry
}
local jwt_obj = jwt:verify(‘secret’, jwtToken, claim_spec)if not jwt_obj[“verified”] then
 ngx.status = ngx.HTTP_UNAUTHORIZED
 ngx.header.content_type = “application/json; charset=utf-8”
 ngx.say(“{\”error\”: \”INVALID_JWT\”}”)
 ngx.exit(ngx.HTTP_UNAUTHORIZED)
 end
end

上面的Lua代码执行以下操作:

  1. 如果是OPTIONS调用或登录API,它将请求转发到下一行执行。
  2. 否则,它将在Authorization标头中获取JWT令牌。如果令牌不存在,则代码返回'FORBIDDEN'
  3. 然后验证此JWT令牌的真实性和有效期。
  4. 令牌通过验证后,会将请求转发到相应的服务。否则,它返回'INVALID_JWT '

将以上文件包含在您的nginx.conf中

location /api/test {
 access_by_lua_file /usr/local/openresty/lualib/resty/jwt-auth.lua;
 proxy_pass http://localhost:8080/api/test;
}

您已在Nginx上添加了JWT身份验证。

测验

要检查我们所做的更改,重新启动OpenResty

使用Postman或任何其他REST客户端访问API并验证响应。

 

提示:可以使用以下网站生成JWT令牌:

http : //jwtbuilder.jamiekurtz.com/

 

更多信息参考:https://github.com/auth0/nginx-jwt

相关文章