首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MS Azure OAuth2基于代理令牌的身份验证而不是oauth_proxy cookie

MS Azure OAuth2基于代理令牌的身份验证而不是oauth_proxy cookie
EN

Stack Overflow用户
提问于 2020-11-23 09:26:31
回答 2查看 5.1K关注 0票数 6

我在Azure中使用一个Kubernetes部署模型,它有一个OAuth2代理(https://github.com/oauth2-proxy/oauth2-proxy),它通过通过各种客户端启用SSO登录来保护集群资源。从最终用户的角度来看,这是可以的,因为他们可以轻松地使用他的SSO客户端登录。当OAuth2代理背后的服务公开的API需要由外部应用程序通过REST调用使用时,问题就出现了。

配置是默认的配置,它为OAuth2提供了一个专门的Kubernetes服务,并在inside文件中遵循了以下规则。

代码语言:javascript
复制
nginx.ingress.kubernetes.io/auth-signin: 'https://$host/oauth2/start?rd=$request_uri'
nginx.ingress.kubernetes.io/auth-url: 'https://$host/oauth2/auth'

根据我检查的内容,目前这些服务只能通过来自外部应用程序(例如,Postman)的REST调用来使用,只有当我添加了一个cookie ,该cookie是在使用UI和SSO客户端提供程序成功登录后生成的。如果我不添加这个cookie参数,就不会出现像cookie _oauth_proxy这样的错误。

是否有任何选项可以添加到代理配置中,以便允许基于令牌的身份验证和授权/编程生成某些标识符,以便通过REST调用为技术用户(外部应用程序)访问OAuth2代理背后的资源?我可以根据现有的配置(客户机id、机密、应用程序范围等)生成访问令牌。

OAuth2代理部署YAML如下所示:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: oauth2-proxy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: oauth2-proxy
  template:
    metadata:
      labels:
        app: oauth2-proxy
    spec:
      containers:
      - env:
          - name: OAUTH2_PROXY_PROVIDER
            value: azure
          - name: OAUTH2_PROXY_AZURE_TENANT
            value: <REPLACE_WITH_DIRECTORY_ID>
          - name: OAUTH2_PROXY_CLIENT_ID
            value: <REPLACE_WITH_APPLICATION_ID>
          - name: OAUTH2_PROXY_CLIENT_SECRET
            value: <REPLACE_WITH_SECRET_KEY>
          - name: OAUTH2_PROXY_COOKIE_SECRET
            value: <REPLACE_WITH_VALUE_OF python -c 'import os,base64; print base64.b64encode(os.urandom(16))'>
          - name: OAUTH2_PROXY_HTTP_ADDRESS
            value: "0.0.0.0:4180"
          - name: OAUTH2_PROXY_UPSTREAM
            value: "<AZURE KUBERNETES CLUSTER HOST e.g.  >"
        image: bitnami/oauth2-proxy:latest
        imagePullPolicy: IfNotPresent
        name: oauth2-proxy
        ports:
        - containerPort: 4180
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: oauth2-proxy
  name: oauth2-proxy
  namespace: default
spec:
  ports:
  - name: http
    port: 4180
    protocol: TCP
    targetPort: 4180
  selector:
    app: oauth2-proxy 

编辑:

我终于能够通过AD OAuth2令牌端点使用生成的令牌来调用代理后面的API。为了实现这一点,我将码头映像从machinedata/oauth2_proxy更改为bitnami/oauth2-proxy.。除此之外,我还向容器添加了以下参数

代码语言:javascript
复制
 args:
 - '--provider=azure'
 - '--azure-tenant=TENANT_ID'
 - '--skip-jwt-bearer-tokens=true'
 - >-
     --oidc-issuer-url=https://sts.windows.net/TENANT_ID/
 - >-
    --extra-jwt-issuers=https://login.microsoftonline.com/TENANT_ID/v2.0=APP_ID
 - '--request-logging=true'
 - '--auth-logging=true'
 - '--standard-logging=true'

此外,我还必须对来自Azure的应用程序注册清单进行一些更改,以便通过OAuth2代理根据正确的版本验证令牌。

代码语言:javascript
复制
"accessTokenAcceptedVersion": 2

我在这里也找到了一些有用的解释:https://github.com/oauth2-proxy/oauth2-proxy/issues/502

现在,我可以使用Azure提供的令牌端点为我的API调用生成一个Bearer令牌。唯一仍然存在的问题是,当我试图访问应用程序UI时,出现了一个错误。

在pod日志中收到的错误/警告是:警告:这个会话需要多个cookie,因为它超过了4kb的cookie限制。请使用服务器端会话存储(例如。而不是红色。

在浏览器中接收到的错误是502坏网关

编辑2:

我能够绕过这个新的错误,在我的入口级为OAuth2代理增加缓冲区大小。更多细节可以在下面的URL中找到。https://oauth2-proxy.github.io/oauth2-proxy/docs/configuration/oauth_provider/#azure-auth-provider https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-22 13:00:59

最后,我使用以下配置使其工作:

deployment.yaml用于OAuth2代理:

代码语言:javascript
复制
kind: Deployment
apiVersion: apps/v1
metadata:
  name: oauth2-proxy
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: oauth2-proxy
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: oauth2-proxy
    spec:
      containers:
        - name: oauth2-proxy
          image: 'bitnami/oauth2-proxy:latest'
          args:
            - '--provider=azure'
            - '--azure-tenant=TENANT_ID'
            - '--skip-jwt-bearer-tokens=true'
            - >-
              --oidc-issuer-url=https://sts.windows.net/TENANT_ID/
            - >-
              --extra-jwt-issuers=https://login.microsoftonline.com/TENANT_ID/v2.0=CLIENT_ID
            - '--request-logging=true'
            - '--auth-logging=true'
            - '--standard-logging=true'
          ports:
            - containerPort: 4180
              protocol: TCP
          env:
            - name: OAUTH2_PROXY_AZURE_TENANT
              value: TENANT_ID
            - name: OAUTH2_PROXY_CLIENT_ID
              value: CLIENT_ID
            - name: OAUTH2_PROXY_CLIENT_SECRET
              value: CLIENT_SECRET
            - name: OAUTH2_PROXY_COOKIE_SECRET
              value: COOKIE_SECRET
            - name: OAUTH2_PROXY_HTTP_ADDRESS
              value: '0.0.0.0:4180'
            - name: OAUTH2_PROXY_UPSTREAM
              value: 'http://your-host'
            - name: OAUTH2_PROXY_EMAIL_DOMAINS
              value: '*'

ingress.yaml for OAuth2 proxy:

代码语言:javascript
复制
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: oauth2-proxy
  namespace: default
  labels:
    app: oauth2-proxy
  annotations:
    kubernetes.io/ingress.class: addon-http-application-routing
    # in my case the generated cookie was too big so I had to add the below parameters
    nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
    nginx.ingress.kubernetes.io/proxy-buffers-number: '4'
spec:
  tls:
    - hosts:
        - YOUR_HOST
  rules:
    - host: YOUR_HOST
      http:
        paths:
          - path: /oauth2
            backend:
              serviceName: oauth2-proxy
              servicePort: 4180

除了这些配置文件之外,我还必须在Azure应用程序注册清单中更改accessTokenAcceptedVersion的值。默认情况下,此值设置为null,这意味着它将用于V1令牌,而不是参数中指定的V2。

代码语言:javascript
复制
"accessTokenAcceptedVersion": 2

在进行了这些更改之后,我可以通过Azure令牌端点使用生成的令牌,以便通过OAuth2代理并到达应用程序公开的API:

代码语言:javascript
复制
HTTP POST to https://login.microsoftonline.com/TENANT_ID/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded
Body:
  - client_id: YOUR_CLIENT_ID
  - grant_type: client_credentials
  - client_secret: YOUR_CLIENT_SECRET
  - scope: api://YOUR_CLIENT_ID/.default - this was generated by me, but it should work with MS Graph as well
票数 10
EN

Stack Overflow用户

发布于 2021-09-02 17:46:09

我在Azure中使用了一个Kubernetes部署模型,它有一个OAuth2代理,它通过启用SSO登录来保护集群资源。我已经成功地运行了Oauth服务,我还部署了应用程序入口和oauth入口。但是当我访问应用程序URL时,我得到了500个内部错误。如果我访问Oauth入口url,我就得到了登录窗口。我可以提供有关oauth部署yaml以及应用程序入口和oauth入口yaml的详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64965691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档