Nginx是一个Web服务器,也可以用作反向代理,负载平衡器,邮件代理和HTTP缓存。Nginx可用于创建一个API网关,该API网关以事件驱动的方式处理请求,并以快速,资源占用少的方式处理对服务器的查询。此外,它还降低了复杂性并通过降低性能来最大化性能提供API调用的平均响应时间。
我们大多数人都已经熟悉Kong,探索使用OpenResty构建API网关的可能性。
我们需要做的第一件事是安装openresty。OpenResty使我们能够使用Lua编写Nginx脚本。
安装完成后,您应该导航到浏览器并输入http://localhost。如果一切顺利,您将看到以下屏幕截图:
对于基本的API网关,应执行两个重要操作:
- 路由
- 认证方式
路由
要将端点路由到其各自的服务器:
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代码执行以下操作:
- 如果是OPTIONS调用或登录API,它将请求转发到下一行执行。
- 否则,它将在Authorization标头中获取JWT令牌。如果令牌不存在,则代码返回'FORBIDDEN'。
- 然后验证此JWT令牌的真实性和有效期。
- 令牌通过验证后,会将请求转发到相应的服务。否则,它返回'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/