Kong是一个开源的API网关和微服务管理层,它提供了请求路由、负载均衡、认证授权、监控等功能。在API调用中,access_token通常用于身份验证和授权。
最常见的方式是通过HTTP Header传递access_token,通常使用Authorization
头:
Authorization: Bearer <access_token>
GET /api/resource?access_token=<token>
Cookie: access_token=<token>
curl -X POST http://localhost:8001/services/{service}/plugins \
--data "name=jwt"
# 创建消费者
curl -X POST http://localhost:8001/consumers \
--data "username=<username>"
# 创建JWT凭证
curl -X POST http://localhost:8001/consumers/<username>/jwt \
-F "algorithm=HS256" \
-F "key=<your-key>" \
-F "secret=<your-secret>"
curl -X POST http://localhost:8001/services/{service}/plugins \
--data "name=oauth2" \
--data "config.scopes=email,phone,address" \
--data "config.mandatory_scope=true" \
--data "config.enable_authorization_code=true"
如果需要更灵活的处理,可以开发自定义插件:
local BasePlugin = require "kong.plugins.base_plugin"
local AccessTokenHandler = BasePlugin:extend()
function AccessTokenHandler:new()
AccessTokenHandler.super.new(self, "access-token")
end
function AccessTokenHandler:access(conf)
AccessTokenHandler.super.access(self)
-- 从header中获取token
local token = kong.request.get_header("Authorization")
-- 或者从query参数获取
if not token then
token = kong.request.get_query()["access_token"]
end
-- 验证token逻辑
if not token then
return kong.response.exit(401, {message = "Missing access token"})
end
-- 将token传递给上游服务
kong.service.request.set_header("X-Access-Token", token)
end
return AccessTokenHandler
Authorization: Bearer
格式原因:使用不安全的传输方式(如HTTP) 解决:强制使用HTTPS,启用HSTS
原因:未及时刷新token 解决:实现自动刷新机制,或返回明确的过期错误
原因:每次请求都验证签名 解决:使用短期有效token配合缓存
原因:微服务架构中需要传递token 解决:使用Kong的header传递或服务网格方案
通过合理配置Kong网关,可以安全高效地管理和传递access_token,为API提供可靠的认证授权机制。
没有搜到相关的文章