1.21.4. 身份验证请求
这个发行版本支持以下验证方法:
- 标准 API 键:使用一个随机字符串或哈希值作为标识符和 secret 令牌。
- 应用程序标识符和键对:不可改变的标识符和可变的密键字符串。
- OpenID 验证方法:从 JSON Web Token 解析的客户端 ID 字符串。
1.21.4.1. 应用验证模式
如以下验证方法示例所示,修改 instance
自定义资源来配置身份验证的方法。您可以接受以下身份验证凭证:
- 请求的标头(header)
- 请求参数
- 请求标头和查询参数
当通过标头指定值时,必须为小写。例如,如果需要发送一个标头为 User-Key
,则需要在配置中使用 request.headers["user-key"]
来指代它。
1.21.4.1.1. API 键验证方法
根据在 subject
自定义资源参数的 user
选项,Service Mesh 在查询参数和请求标头中查找 API 键。它会按照自定义资源文件中给出的顺序检查这些值。您可以通过跳过不需要的选项,把对 API 键的搜索限制为只搜索查询参数或只搜索请求标头。
在这个示例中,Service Mesh 在 user_key
查询参数中查找 API 键。如果 API 键不在查询参数中,Service Mesh 会检查 user-key
标头。
API 键验证方法示例
apiVersion: "config.istio.io/v1alpha2" kind: instance metadata: name: threescale-authorization namespace: istio-system spec: template: authorization params: subject: user: request.query_params["user_key"] | request.headers["user-key"] | "" action: path: request.url_path method: request.method | "get"
如果您希望适配器检查不同的查询参数或请求标头,请根据情况更改名称。例如:要在名为 "key" 的查询参数中检查 API 键,把 request.query_params["user_key"]
改为 query_params["key"]
。
1.21.4.1.2. 应用程序 ID 和应用程序键对验证方法
根据 subject
自定义资源参数中的 properties
选项,Service Mesh 在查询参数和请求标头中查找应用程序 ID 和应用程序键。应用程序键是可选的。它会按照自定义资源文件中给出的顺序检查这些值。通过不使用不需要的选项,可以将搜索凭证限制为只搜索查询参数或只搜索请求标头。
在这个示例中,Service Mesh 会首先在查询参数中查找应用程序 ID 和应用程序键,如果需要,再对请求标头进行查找。
应用程序 ID 和应用程序键对验证方法示例
apiVersion: "config.istio.io/v1alpha2" kind: instance metadata: name: threescale-authorization namespace: istio-system spec: template: authorization params: subject: app_id: request.query_params["app_id"] | request.headers["app-id"] | "" app_key: request.query_params["app_key"] | request.headers["app-key"] | "" action: path: request.url_path method: request.method | "get"
如果您希望适配器检查不同的查询参数或请求标头,请根据情况更改名称。例如,要在名为 identification
的查询参数中查找应用程序 ID,把 request.query_params["app_id"]
改为 request.query_params["identification"]
。
1.21.4.1.3. OpenID 验证方法
要使用 OpenID Connect (OIDC) 验证方法,使用 subject
字段中的 properties
值设定 client_id
及可选的 app_key
。
您可以使用前面描述的方法操作这个对象。在下面的示例配置中,客户标识符(应用程序 ID)是从标签 azp 下的 JSON Web Token (JWT) 解析出来的。您可以根据需要修改它。
OpenID 验证方法示例
apiVersion: "config.istio.io/v1alpha2" kind: instance metadata: name: threescale-authorization spec: template: threescale-authorization params: subject: properties: app_key: request.query_params["app_key"] | request.headers["app-key"] | "" client_id: request.auth.claims["azp"] | "" action: path: request.url_path method: request.method | "get" service: destination.labels["service-mesh.3scale.net/service-id"] | ""
要使这个集成服务可以正常工作,OIDC 必须在 3scale 中完成,以便客户端在身份提供者 (IdP) 中创建。您应该为您要保护的服务在与该服务相同的命名空间中创建 Request 授权。JWT 由请求的 Authorization
标头传递。
在下面定义的 RequestAuthentication
示例中,根据情况替换 issuer
、jwksUri
和 selector
。
OpenID 策略示例
apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: bookinfo spec: selector: matchLabels: app: productpage jwtRules: - issuer: >- http://keycloak-keycloak.34.242.107.254.nip.io/auth/realms/3scale-keycloak jwksUri: >- http://keycloak-keycloak.34.242.107.254.nip.io/auth/realms/3scale-keycloak/protocol/openid-connect/certs
1.21.4.1.4. 混合验证方法
您可以选择不强制使用一个特定的验证方法,而是接受任何有效的凭证。如果 API 键和应用程序 ID/应用程序键对都被提供,则 Service Mesh 会使用 API 键。
在这个示例中,Service Mesh 在查询参数中检查一个 API 键,然后是请求标头。如果没有 API 键,则会在查询参数中检查应用程序 ID 和键,然后查询请求标头。
混合验证方法示例
apiVersion: "config.istio.io/v1alpha2" kind: instance metadata: name: threescale-authorization spec: template: authorization params: subject: user: request.query_params["user_key"] | request.headers["user-key"] | properties: app_id: request.query_params["app_id"] | request.headers["app-id"] | "" app_key: request.query_params["app_key"] | request.headers["app-key"] | "" client_id: request.auth.claims["azp"] | "" action: path: request.url_path method: request.method | "get" service: destination.labels["service-mesh.3scale.net/service-id"] | ""