Authservice使用外部服务来实现身份验证和授权。简单来说,Client向Ambassador网关发送的请求,都会被Ambassador拦截,Ambassador会将拦截的请求报文体去除,只将报文头转发给外部认证服务,外部认证服务会进行身份验证或者校验token,如果合法将返回http状态码200,否则返回非200状态码。详细流程如下:
- AuthService是第一个调用的外部服务。Ambassador将http method和header都转发给AuthService服务,只做两个缺省变更:
- Content-Length请求头被置为0.
- 请求体body被移除。
- 当返回HTTP状态码200时,表示认证或者校验成功,允许继续向上游服务请求,其它所有的状态码都将阻止请求继续进行,直接返回给客户端。
- bypass_auth:在Mapping中配置属性bypass_auth为true,禁用该mapping的身份验证。
- proto:外部认证服务支持的协议类型,包括http和grpc,缺省为http。
- include_body:是否包含报文体,缺省报文体会被去除。
- max_bytes:传递给AuthService的报文体body的最大字节数。
- allow_partial:如果为true,第一个最大字节数会被发送给AuthService,否则请求将被拒绝。
- status_on_error:如果AuthService无法响应时返回的状态码,缺省为403。
- failure_node_allow:如果AuthService失败时,请求是否允许转到上游服务,缺省为false。
- 支持配置多个AuthService。
下面举一例子。作者开发了一个简单的SpringBoot应用,该应用在拦截器中接受username和password两个参数,如果username=admin并且password=123时,返回http状态码200,否则返回状态码403。此服务作为外部认证服务。该服务已经放到hub.docker.io中,存储库为twingao/auth-server:1.0.0。
public boolean preHandle(HttpServletRequest