OAuth2

使用 OAuth2 中间件来保护 HTTP 端点

OAuth2 HTTP 中间件 可在无需修改应用程序的情况下,为 Web API 启用 OAuth2 授权码流程。这种设计将身份验证/授权的关注点与应用程序分离,使应用程序运维人员可以采用和配置身份验证/授权提供程序,而不会影响应用程序代码。

组件格式

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: oauth2
spec:
  type: middleware.http.oauth2
  version: v1
  metadata:
  - name: clientId
    value: "<your client ID>"
  - name: clientSecret
    value: "<your client secret>"
  - name: scopes
    value: "https://www.googleapis.com/auth/userinfo.email"
  - name: authURL
    value: "https://accounts.google.com/o/oauth2/v2/auth"
  - name: tokenURL
    value: "https://accounts.google.com/o/oauth2/token"
  - name: redirectURL
    value: "http://dummy.com"
  - name: authHeaderName
    value: "authorization"
  - name: forceHTTPS
    value: "false"
  - name: pathFilter
    value: ".*/users/.*"

规范元数据字段

字段详细信息示例
clientId您的应用程序的客户端 ID,它是作为由支持 OAuth 的平台托管的凭据的一部分创建的
clientSecret您的应用程序的客户端密钥,它是作为由支持 OAuth 的平台托管的凭据的一部分创建的
scopes以空格分隔、区分大小写的 scope 字符串列表,通常用于应用程序中的授权"https://www.googleapis.com/auth/userinfo.email"
authURLOAuth2 授权服务器的端点"https://accounts.google.com/o/oauth2/v2/auth"
tokenURL客户端用于通过出示其授权授权或刷新令牌来获取访问令牌的端点"https://accounts.google.com/o/oauth2/token"
redirectURL授权服务器应在用户完成身份验证后重定向到的 Web 应用程序 URL"https://myapp.com"
authHeaderName要转发到您的应用程序的授权标头名称"authorization"
forceHTTPS如果为 true,则强制使用 TLS/SSL"true","false"
pathFilter仅将中间件应用于与给定路径模式匹配的请求".*/users/.*"

Dapr 配置

要应用中间件,必须在配置中引用它。请参阅中间件管道

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  httpPipeline:
    handlers:
    - name: oauth2
      type: middleware.http.oauth2

请求路径过滤

pathFilter 字段允许您使用正则表达式模式根据 HTTP 请求路径有选择地应用 OAuth2 身份验证。这支持以下场景:例如为不同的 API 端点配置具有不同 scope 的多个 OAuth2 中间件,通过确保用户仅获得其预期操作所需的最小权限,来实现最小权限原则。

示例:分离只读和管理员用户访问

在以下配置中:

  • /api/users/* 端点的请求获得具有只读用户 scope 的令牌
  • /api/admin/* 端点的请求获得具有完整管理员 scope 的令牌

这通过防止不必要的权限访问并限制受损令牌的影响范围来降低安全风险。

# 具有只读访问权限的用户
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: oauth2-users
spec:
  type: middleware.http.oauth2
  version: v1
  metadata:
  - name: clientId
    value: "<your client ID>"
  - name: clientSecret
    value: "<your client secret>"
  - name: scopes
    value: "user:read profile:read"
  - name: authURL
    value: "https://accounts.google.com/o/oauth2/v2/auth"
  - name: tokenURL
    value: "https://accounts.google.com/o/oauth2/token"
  - name: redirectURL
    value: "http://myapp.com/callback"
  - name: pathFilter
    value: "^/api/users/.*"
---
# 具有完整管理员访问权限的用户
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: oauth2-admin
spec:
  type: middleware.http.oauth2
  version: v1
  metadata:
  - name: clientId
    value: "<your client ID>"
  - name: clientSecret
    value: "<your client secret>"
  - name: scopes
    value: "admin:read admin:write user:read user:write"
  - name: authURL
    value: "https://accounts.google.com/o/oauth2/v2/auth"
  - name: tokenURL
    value: "https://accounts.google.com/o/oauth2/token"
  - name: redirectURL
    value: "http://myapp.com/callback"
  - name: pathFilter
    value: "^/api/admin/.*"

相关链接