【发布时间】:2020-04-10 20:51:12
【问题描述】:
我是 Kubernetes 新手,我一直在学习 Ingress。在入口点处理 TLS 证书和身份验证的想法给我留下了深刻的印象。我添加了一个简单的静态文件服务器,并添加了 cert-manager,所以我基本上有一个 HTTPS 静态网站。
我读到 NGINX 入口控制器可以与 oauth2 代理一起使用来处理入口处的身份验证。问题是我根本无法让它工作。我可以确认我的 oauth2-proxy 部署服务和部署存在且正确 - 在 Pod 的日志中,我可以看到来自 NGINX 的请求,但我看不到它在 Azure B2C 上实际调用的 uri。每当我尝试访问我的服务时,我都会收到 500 内部错误 - 如果我将我的 /oath2/auth 地址放在浏览器中,我会收到“不支持请求中指定的范围 'openid'。”。但是,如果我在 Azure 中测试运行用户流,测试 URL 还会指定“openid”并且它按预期运行。
我认为,如果我能找到如何监控来自 Azure 的 oauth2-proxy 请求(即通过观察它的 uri 来找出我的配置错误的地方),我可以解决这个问题 - 否则,也许有人已经这样做了告诉我配置哪里出错了。
我的配置如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: oauth2-proxy
name: oauth2-proxy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
k8s-app: oauth2-proxy
template:
metadata:
labels:
k8s-app: oauth2-proxy
spec:
containers:
- args:
- -provider=oidc
- -email-domain=*
- -upstream=file:///dev/null
- -http-address=0.0.0.0:4180
- -redirect-url=https://jwt.ms/
- -oidc-issuer-url=https://<tenant>.b2clogin.com/tfp/<app-guid>/b2c_1_manager_signup/
- -cookie-secure=true
- -scope="openid"
# Register a new application
# https://github.com/settings/applications/new
env:
- name: OAUTH2_PROXY_CLIENT_ID
value: <app-guid>
- name: OAUTH2_PROXY_CLIENT_SECRET
value: <key-base64>
- name: OAUTH2_PROXY_COOKIE_SECRET
value: <random+base64>
image: quay.io/pusher/oauth2_proxy:latest
imagePullPolicy: Always
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:
k8s-app: oauth2-proxy
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: static1-oauth2-proxy
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
spec:
rules:
- host: cloud.<mydomain>
http:
paths:
- backend:
serviceName: oauth2-proxy
servicePort: 4180
path: /oauth2
tls:
- hosts:
- cloud.<mydomain>
secretName: cloud-demo-crt
在我的静态站点入口中,我将以下内容添加到 metadata.annotations:
nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$request_uri"
我不能 100% 确定这些注释是否应该始终这样设置,或者我是否应该为 B2C/OIDC 更改这些注释,但它们似乎转到了代理,这正是代理接下来要做的事情失败。
请注意,日志确实表明 oauth2-proxy 已连接到 B2C,实际上,如果颁发者 uri 发生更改,则会进入崩溃回退循环。
似乎有很多关于如何设置的文章,所以我确信这是可能的,但我有点迷失了。如果有人可以帮助调试设置或想法,那就太好了。
谢谢。
现在我能够可靠地获取 ?state= 和 code= 以显示在 /oauth2/callback 页面的浏览器窗口中,但该页面报告内部错误。 oauth2_proxy 正在记录它现在应该记录的时间,并且日志显示:
[2020/06/03 21:18:07] [oauthproxy.go:803] 在 OAuth2 回调期间兑换代码时出错:令牌交换:oauth2:服务器响应缺少 access_token
我的 Azure B2C 审核日志显示它正在发布 id_tokens。
当我查看 oauth2_proxy 的源代码时,似乎问题发生在 oauth2.config.Exchange() 期间 - 它位于 goloang 库中 - 我不知道那是什么,但我不知道认为它适用于 Azure B2c。有人知道我如何从这里取得进步吗?
谢谢。
标记
【问题讨论】:
-
golang/x/exchange::config.Exchange 的代码显示它没有将 Client_Id 应用于 oidc 发现中的 TokenUrl。 Azure B2C 没有 client_id 作为 Url 的一部分,因此我可能会在今天稍后再查看。
标签: azure nginx oauth-2.0 proxy oauth2-proxy