我求助于在 VSCode 中编译和调试代理应用程序。我运行了一个简单的 NGINX 代理来向代理提供 TLS 终止,以允许 Azure B2C 端运行。事实证明我做错了很多事情。以下是我解决的问题列表,希望其他人能够使用它来通过 Azure B2C 运行自己的 oauth_proxy。
当附加到调试器时,很明显,oauth2_proxy 读取令牌并期望依次fin,access_token,然后id_token,然后它需要(默认情况下)“电子邮件”声明。
要返回“access_token”,您必须请求访问某些资源。最初我没有这个。在我的 yaml 文件中,我有:
- --scope=openid
注意:不要在 YAML 中的范围值两边加上引号,因为它们会被视为请求范围值的一部分!
我必须通过“应用程序注册”和“公开 API”在 Azure B2C 中设置“读取”范围。我最终有效的范围是这样的:
- --scope=https://<myspacename>.onmicrosoft.com/<myapiname>/read openid
您必须确保两个范围(read 和 openid)一起通过,否则您不会获得 id_token。如果您收到一条错误消息,指出服务器响应中没有 id_token,请确保在使用 --scope 标志的单次使用中同时处理这两个值。
一旦您拥有 access_token 和 id_token,oauth2_proxy 就会失败,因为没有“电子邮件”声明。 Azure B2C 有一个“电子邮件”声明,但我认为不能使用。为了解决这个问题,我使用了对象 id,我设置:
- --user-id-claim=oid
我遇到的最后一个问题是浏览器中没有设置 cookie。我确实在 oauth2-proxy 输出中看到了一个错误,即 cookie 值本身太长,然后我删除了“offline_access”范围,该消息就消失了。然而浏览器中仍然没有cookie。
然而,我的 NGinX 入口日志确实有一条消息,表明标头超过 8K,因此 NGinX 报告 503 错误。
在 oauth2-proxy 文档中,有一个描述,如果您的 cookie 很长,则应使用 Redis 存储 - 它特别将 Azure AD cookie 标识为足够长以保证 Redis 解决方案。
我安装了一个单节点 Redis 来使用此答案中的 YAML 配置进行测试(未强化)https://stackoverflow.com/a/53052122/2048821 https://stackoverflow.com/a/53052122/2048821- 必须使用 --session-store-type=redis 和 --redis-connection-url 选项。
我的 oauth2_proxy 的最终服务/部署如下所示:
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://<myhost>/oauth2/callback
- --oidc-issuer-url=https://<mynamespane>.b2clogin.com/tfp/<my-tenant>/b2c_1_signin/v2.0/
- --cookie-secure=true
- --cookie-domain=<myhost>
- --cookie-secret=<mycookiesecret>
- --user-id-claim=oid
- --scope=https://<mynamespace>.onmicrosoft.com/<myappname>/read openid
- --reverse-proxy=true
- --skip-provider-button=true
- --client-id=<myappid>
- --client-secret=<myclientsecret>
- --session-store-type=redis
- --redis-connection-url=redis://redis:6379
# Register a new application
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
希望这可以为某人节省很多时间。
Mark