gpt4 book ai didi

azure - MS Azure OAuth2 代理 - 基于 token 的身份验证而不是 oauth_proxy cookie

转载 作者:行者123 更新时间:2023-12-02 05:51:55 25 4
gpt4 key购买 nike

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

配置是默认配置,具有用于 OAuth2 的专用 Kubernetes 服务以及 Ingress 文件内的以下规则。

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 参数(_oauth2_proxy ),这是使用 UI 和 SSO 客户端提供程序成功登录后生成的。如果我不添加此 cookie 参数,则会出现诸如 cookie _oauth_proxy 不存在之类的错误。

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

OAuth2 代理部署 YAML 如下所示:

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 token 端点使用生成的 token 来调用代理后面的 API。为了实现这一目标,我将 docker 镜像从 ma​​chinedata/oauth2_proxy 更改为 bitnami/oauth2-proxy。除此之外,我向容器添加了以下参数:

 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 AD 中的应用注册 list 进行一些更改,以便 OAuth2 代理根据正确的版本验证 token 。

"accessTokenAcceptedVersion": 2

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

现在我可以使用 Azure 提供的 token 端点为我的 API 调用生成承载 token 。唯一仍然存在的问题是当我尝试访问应用程序 UI 时出现的错误。

pod 日志中收到的错误/警告是:警告:此 session 需要多个 cookie,因为它超出了 4kb cookie 限制。请改用服务器端 session 存储(例如 Redis)。

浏览器中收到的错误是502 Bad Gateway

编辑#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/

最佳答案

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

deployment.yaml 用于 OAuth2 代理:

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 用于 OAuth2 代理:

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 应用程序注册 list 中 accessTokenAcceptedVersion 的值。默认情况下,此值设置为 null,这意味着它将使用 V1 token ,而不是 extra-jwt-issuers 参数中指定的 V2。

"accessTokenAcceptedVersion": 2

完成这些更改后,我能够通过 Azure token 端点使用生成的 token ,以便通过 OAuth2 代理并访问我的应用程序公开的 API:

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

关于azure - MS Azure OAuth2 代理 - 基于 token 的身份验证而不是 oauth_proxy cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64965691/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com