功能介绍
云原生网关提供自定义鉴权的能力,方便实现在网关入口进行统一鉴权。当客户端请求携带的凭证信息(Token)为自定义的格式时,网关可根据配置将请求转发到中心化的鉴权服务来完成鉴权操作,并根据鉴权结果转发/拒绝请求,以保护 API 接口的通信安全。
云原生网关自定义鉴权流程如下:
云原生网关自定义鉴权提供如下能力:
支持配置在网关服务或路由上,以针对特定路由或特定服务下所有路由进行自定义鉴权。
支持配置鉴权服务不可用策略,包括直接放通和直接拒绝。
支持配置路由白名单,简化使用。即服务下某些白名单路由将不进行鉴权,其余路由进行鉴权。
支持配置鉴权结果返回策略,包括通过HTTP 状态码标识和通过响应头标识。
鉴权请求支持携带 Header 和 body。
鉴权响应支持保留 Header 和 body(通过响应头传递)。
支持未携带Token请求时跳转到重定向地址进行token获取。
插件配置说明
字段名称 | 字段含义 | 说明 |
description | 插件描述 | - |
auth service id | 鉴权服务 ID | |
auth service path | 鉴权 API 路径 | - |
token key name | 存放 Token 的请求头名称 | - |
route id whitelist | 路由白名单,路由 ID 列表不进行鉴权。 | - |
timeout | 超时时间:鉴权服务超时时间,默认 10 秒。 | - |
auth server unavailable policy | 鉴权服务不可用策略,当鉴权服务不可用时,网关处理客户端请求的策略。支持直接放通(allow)和直接拒绝(deny)两种。 | 直接放通(allow):当鉴权服务不可用时,网关直接放通客户端请求到后端服务。 直接拒绝(deny):当鉴权服务不可用时,网关拒绝客户端请求,返回403状态码,返回 Header 标识鉴权服务不可用。 |
redirect path | 请求未携带 Token 时的重定向路径 | 网关返回 302 进行重定向,重定向 URL 拼接规则为: {请求scheme}://{请求Host}/{redirect_path} |
allow request body | 鉴权请求中是否允许携带Body | - |
allow request headers | 鉴权请求允许携带的 Header 列表 | - |
auth result identifier | 鉴权结果返回策略,支持通过HTTP状态码标识(HTTP_status_code)或通过响应头(response_header)返回两种 | HTTP 状态码标识(HTTP_status_code):鉴权服务返回 200 时,鉴权成功;其余均认为鉴权失败。 通过响应头返回(response_header):鉴权服务器到网关返回 HTTP 200 ,通过自定义响应头标识鉴权结果,当指定响应对应值为 true 时,鉴权成功,响应头对应值为 false 或空时,鉴权失败。 |
auth result response header | 鉴权结果自定义响应头 | - |
auth body header | 鉴权响应 Body 所属响应头 | 支持将鉴权服务返回 Body 存放在自定义响应头中传回客户端。 |
allow response headers | 鉴权响应中允许携带的 Header 列表 | - |
使用场景
前提步骤
1. 创建需要访问的后端服务 nginx 和路由。
2. 新建鉴权服务 auth_service,根据鉴权服务信息,填写服务类型、地址列表、请求协议。
单击确定,在服务信息Tab 查看鉴权服务的服务信息。
3. 安装自定义鉴权插件
进入控制台 > 插件管理,选择系统插件 > tse-custom-auth,点击安装最新版本即可安装。
场景一:鉴权结果通过 HTTP 状态码标识
场景说明:当您的鉴权服务器使用HTTP状态码标识鉴权结果时,可配置 auth result identifier 为 HTTP status code,网关将根据鉴权服务器返回的状态码判定鉴权结果,当状态码为 200 时认为鉴权成功,网关将转发请求到后端服务;其余情况则认为鉴权失败,拒绝请求。
操作步骤:
1. 登录 Konga,单击 nginx 服务进入详情。
2. 单击 Plugins > +ADD Plugin添加自定义鉴权插件
3. 填写插件配置,点击 ADD PLUGIN,设置鉴权结果返回策略为 HTTP 状态码。
4. 确认插件已绑定后端服务。
5. 未携带Token访问后端服务,访问被拒绝,返回 401。
6. 携带正确的Token访问后端服务,成功访问后端服务。
7. 携带错误的Token访问后端服务,访问被拒绝,返回 401。
场景二:鉴权结果通过响应头返回失败信息
场景说明:当您的客户端始终接受 200 状态码,需要通过响应头来标识鉴权结果时,可配置 auth result identifier 为 response header,并定义一个存放鉴权接过的 Header 头。网关将尝试获取该响应头的值判定鉴权结果,当 Header 值为 true 时认为鉴权成功,网关将转发请求到后端服务;其余情况则认为鉴权失败,拒绝请求。
操作步骤:
1. 登录 Konga,单击 nginx 服务进入详情。
2. 单击 Plugins > +ADD Plugin 添加自定义鉴权插件。
3. 填写插件配置,单击 ADD PLUGIN,设置鉴权结果返回策略为响应头,并定义鉴权结果所在的响应头 Header 为 AuthRes。
4. 确认插件已绑定后端服务。
5. 鉴权服务返回响应头 AuthRes=true 时,鉴权通过。
6. 鉴权服务未返回响应头 AuthRes时,鉴权失败。
场景三:鉴权服务不可用场景
场景说明:当鉴权服务不可用(没有回包)时,网关会根据您的配置对请求进行全部放通/全部拒绝。
操作步骤
1. 登录 Konga,点击 nginx 服务进入详情。
2. 点击 Plugins > +ADD Plugin 添加自定义鉴权插件。
3. 填写插件配置,点击 ADD PLUGIN,设置鉴权服务不可用策略为直接拒绝,配置超时时间为 5000(即 5 秒)。
4. 模拟鉴权服务故障,携带 Token 请求服务,请求在达到超时时间后拒绝,返回的 Header 中标注失败原因。
5. 修改插件配置,设置鉴权服务不可用策略为直接放通。
6. 模拟鉴权服务故障,携带 Token 请求服务,请求在达到超时时间后认为鉴权服务无响应,直接放通请求。
Ingress 配置方式
1. 定义 KongPlugin 资源,可参考如下示例:
apiVersion: configuration.konghq.com/v1kind: KongPluginmetadata:name: my-test-authconfig:timeout: 5000000auth_request_with_body: truetoken_name: Authorizationauth_response_strategy: response_headerauth_path: /oauth/currentUserForTencentauth_response_body_header: serviceredirect_path: nullauth_response_with_headers:- myRespHeader1- myRespHeader2- myRespHeader3auth_request_with_headers:- myReqHeaderauth_service_id: 73efd5bb-7468-43bc-9ca6-03f118169ca2whitelist_route_ids: nulldescription: nullauth_response_header: myRespHeaderauth_fail_strategy: passplugin: tse-custom-auth
2. 将插件绑定在 service 或 route 上。
kubectl apply -f tseauth.yamlkubectl annotate service nginx konghq.com/plugins=my-test-auth