配置自定义鉴权

最近更新时间:2023-08-02 17:33:22

我的收藏

功能介绍

云原生网关提供自定义鉴权的能力,方便实现在网关入口进行统一鉴权。当客户端请求携带的凭证信息(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/v1
kind: KongPlugin
metadata:
name: my-test-auth
config:
timeout: 5000000
auth_request_with_body: true
token_name: Authorization
auth_response_strategy: response_header
auth_path: /oauth/currentUserForTencent
auth_response_body_header: service
redirect_path: null
auth_response_with_headers:
- myRespHeader1
- myRespHeader2
- myRespHeader3
auth_request_with_headers:
- myReqHeader
auth_service_id: 73efd5bb-7468-43bc-9ca6-03f118169ca2
whitelist_route_ids: null
description: null
auth_response_header: myRespHeader
auth_fail_strategy: pass
plugin: tse-custom-auth
2. 将插件绑定在 service 或 route 上。
kubectl apply -f tseauth.yaml
kubectl annotate service nginx konghq.com/plugins=my-test-auth