连接到 Azure B2C 时如何调试 oauth2_proxy?
How can I debug oauth2_proxy when connecting to Azure B2C?
我是 Kubernetes 的新手,我一直在学习 Ingress。在入口处处理 TLS 证书和身份验证的想法给我留下了深刻的印象。我添加了一个简单的静态文件服务器,并添加了cert-manager,所以我基本上有一个HTTPS静态网站。
我读到 NGINX Ingress Controller 可以与 oauth2 代理一起使用来处理入口处的身份验证。问题是我根本无法正常工作。我可以确认我的 oauth2-proxy 部署服务和部署存在且正确 - 在 Pod 的日志中,我可以看到来自 NGINX 的请求,但我看不到它在 Azure B2C 上实际调用的 uri。每当我尝试访问我的服务时,我都会收到 500 内部错误 - 如果我在浏览器中输入 /oath2/auth 地址,我会收到 "The scope 'openid' specified in the request is not supported."。但是,如果我在 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 页面上的浏览器 window 中显示,但该页面报告内部错误。 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 一起正常工作。有人知道我可以从这里取得进展吗?
谢谢。
马克
我在VSCode中使用了编译和调试代理应用程序。我 运行 一个简单的 NGINX 代理,用于向代理提供 TLS 终止,以允许 Azure B2C 端运行。事实证明,我做错了很多事情。以下是我解决的问题列表,希望其他人可以使用它 运行 他们自己的 oauth_proxy 与 Azure B2C。
当附加到调试器时,很明显 oauth2_proxy 读取令牌并期望 fin,依次 access_token,然后 id_token,然后需要(默认情况下) “电子邮件”声明。
要获得 return 的“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 有一个“电子邮件”声明,但我认为不能使用。为了解决这个问题,我使用了 object id,我设置:
- --user-id-claim=oid
我遇到的最后一个问题是浏览器中没有设置 cookie。我确实在 oauth2-proxy 输出中看到 cookie 值本身太长的错误,我删除了“offline_access”范围,该消息消失了。但是浏览器中仍然没有cookie。
然而,我的 NGinX 入口日志确实有一条消息表明 Headers 超过 8K,因此 NGinX 报告了 503 错误。
在 oauth2-proxy 文档中,有一个描述,如果您的 cookie 很长,则应使用 Redis 存储 - 它专门将 Azure AD cookie 标识为足够长 运行 t Redis 解决方案。
我安装了一个节点 Redis 以使用此答案中的 YAML 配置进行测试(未加固)https://whosebug.com/a/53052122/2048821 - --session-store-type=redis 和 -- redis-connection-url 选项必须被使用。
我的 oauth2_proxy 的最终 Service/Deployment 看起来像这样:
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
希望这可以节省很多时间。
马克
我不清楚调试,但根据你的问题,你没有传递 header 参数。
在静态站点入口上,请也添加这个并尝试
nginx.ingress.kubernetes.io/auth-response-headers: X-Auth-Request-Access-Token, Authorization
或者这个
nginx.ingress.kubernetes.io/auth-response-headers: Authorization
我尝试按照 进行操作,但遇到了类似
的错误
oidc: issuer did not match the issuer returned by provider, expected
"https://your-tenant-name.b2clogin.com/tfp/c5b28ff6-f360-405b-85d0-8a87b5783d3b/B2C_1A_signin/v2.0/"
got
"https://your-tenant-name.b2clogin.com/c5b28ff6-f360-405b-85d0-8a87b5783d3b/v2.0/“
( no policy name in the url)
I'm aware that a few of the mainstream providers such as Microsoft
doesn't strictly follow this pattern but you'll have to take it up
with them, or consider the workarounds given by the OIDC library.
还好oauth2-proxy supports
--skip-oidc-discovery 参数:
绕过 OIDC 端点发现。 --login-url、--redeem-url 和 --oidc-jwks-url 必须在这种情况下配置。
参数示例如下:
- --skip-oidc-discovery=true
- --login-url=https://<mynamespace>.b2clogin.com/<mynamespace>.onmicrosoft.com/
b2c_1a_signin/oauth2/v2.0/authorize
- --redeem-url=https://<mynamespace>.b2clogin.com/<mynamespace>.onmicrosoft.com/
b2c_1a_signin/oauth2/v2.0/token
- --oidc-jwks-url=https://<mynamespace>.b2clogin.com/<mynamespace>.onmicrosoft.com/
b2c_1a_signin/discovery/v2.0/keys
要创建 scope,我必须通过“App Registrations”和“Expose an API”在 Azure B2C 中设置应用程序 ID URI。
(例如,参见 https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-web-api-dotnet?tabs=app-reg-ga#configure-scopes)。
我还必须按照 https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-web-api-application?tabs=app-reg-ga#grant-permissions (see also )
中所述授予管理员权限
- —scope=https://<mynamespace>.onmicrosoft.com/<myappname>/<scopeName> openid
您还应该指定
- —oidc_issuer_url=https://<mynamespace>.b2clogin.com/<TenantID>/v2.0/
在oidc_issuer_url中使用Directory/tenantId满足callback/redeem阶段的验证,不需要设置useinsecure_oidc_skip_issuer_verification=true。
另请注意,redirect-url=https:///oauth2/callback 应在 AAD B2C 中注册为应用程序重定向 URI(在应用程序概述中导航重定向 URI 的窗格 link)
根据 and 提供的信息,我还获得了(经过数小时的尝试)与 Azure AD B2C 的有效集成。这是一个重现工作设置的配置,使用 docker-compose 在本地进行测试:
本地设置
version: "3.7"
services:
oauth2proxy:
image: quay.io/oauth2-proxy/oauth2-proxy:latest
command: >
--provider=oidc
--email-domain=*
--upstream=http://web
--http-address=0.0.0.0:9000
--redirect-url=http://localhost:9000
--reverse-proxy=true
--skip-provider-button=true
--session-store-type=redis
--redis-connection-url=redis://redis:6379
--oidc-email-claim=oid
--scope="https://<mynamepsace>.onmicrosoft.com/<app registration uuid>/read openid"
--insecure-oidc-skip-issuer-verification=true
--oidc-issuer-url=https://<mynamespace>.b2clogin.com/<mynamepsace>.onmicrosoft.com/<policy>/v2.0/
environment:
OAUTH2_PROXY_CLIENT_ID: "<app registration client id>"
OAUTH2_PROXY_CLIENT_SECRET: "<app registration client secret>"
OAUTH2_PROXY_COOKIE_SECRET: "<secret follow oauth2-proxy docs to create one>"
ports:
- "9000:9000"
links:
- web
web:
image: kennethreitz/httpbin
ports:
- "8000:80"
redis:
image: redis:latest
这里的重要部分是这些选项:
--oidc-email-claim=oid
--scope="https://<mynamepsace>.onmicrosoft.com/<app registration uuid>/read openid"
--insecure-oidc-skip-issuer-verification=true
--oidc-issuer-url=https://<mynamespace>.b2clogin.com/<mynamepsace>.onmicrosoft.com/<policy>/v2.0/
使用 --insecure-oidc-skip-issuer-verification=true
可让您跳过使用 --login-url --redeem-url --oidc-jwks-url
.
显式提及端点
--oidc-email-claim=oid
替换了
提到的弃用选项 --user-id-claim=oid
正如 Mark 所解释的那样,也需要范围。
Azure AD B2C 设置
这些是在 Azure AD B2C 门户中执行所需的总结步骤:
- 在用户流程中,转到“应用程序声明”并启用“用户的对象 ID”。这是使
--oidc-email-claim=oid
设置生效所必需的
- 在应用程序注册中,在“API 权限”中,创建一个名称为
read
的新权限。这个权限的url是你需要填写的值--scope="..."
。
我是 Kubernetes 的新手,我一直在学习 Ingress。在入口处处理 TLS 证书和身份验证的想法给我留下了深刻的印象。我添加了一个简单的静态文件服务器,并添加了cert-manager,所以我基本上有一个HTTPS静态网站。
我读到 NGINX Ingress Controller 可以与 oauth2 代理一起使用来处理入口处的身份验证。问题是我根本无法正常工作。我可以确认我的 oauth2-proxy 部署服务和部署存在且正确 - 在 Pod 的日志中,我可以看到来自 NGINX 的请求,但我看不到它在 Azure B2C 上实际调用的 uri。每当我尝试访问我的服务时,我都会收到 500 内部错误 - 如果我在浏览器中输入 /oath2/auth 地址,我会收到 "The scope 'openid' specified in the request is not supported."。但是,如果我在 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 页面上的浏览器 window 中显示,但该页面报告内部错误。 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 一起正常工作。有人知道我可以从这里取得进展吗?
谢谢。
马克
我在VSCode中使用了编译和调试代理应用程序。我 运行 一个简单的 NGINX 代理,用于向代理提供 TLS 终止,以允许 Azure B2C 端运行。事实证明,我做错了很多事情。以下是我解决的问题列表,希望其他人可以使用它 运行 他们自己的 oauth_proxy 与 Azure B2C。
当附加到调试器时,很明显 oauth2_proxy 读取令牌并期望 fin,依次 access_token,然后 id_token,然后需要(默认情况下) “电子邮件”声明。
要获得 return 的“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 有一个“电子邮件”声明,但我认为不能使用。为了解决这个问题,我使用了 object id,我设置:
- --user-id-claim=oid
我遇到的最后一个问题是浏览器中没有设置 cookie。我确实在 oauth2-proxy 输出中看到 cookie 值本身太长的错误,我删除了“offline_access”范围,该消息消失了。但是浏览器中仍然没有cookie。
然而,我的 NGinX 入口日志确实有一条消息表明 Headers 超过 8K,因此 NGinX 报告了 503 错误。
在 oauth2-proxy 文档中,有一个描述,如果您的 cookie 很长,则应使用 Redis 存储 - 它专门将 Azure AD cookie 标识为足够长 运行 t Redis 解决方案。
我安装了一个节点 Redis 以使用此答案中的 YAML 配置进行测试(未加固)https://whosebug.com/a/53052122/2048821 - --session-store-type=redis 和 -- redis-connection-url 选项必须被使用。
我的 oauth2_proxy 的最终 Service/Deployment 看起来像这样:
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
希望这可以节省很多时间。
马克
我不清楚调试,但根据你的问题,你没有传递 header 参数。
在静态站点入口上,请也添加这个并尝试
nginx.ingress.kubernetes.io/auth-response-headers: X-Auth-Request-Access-Token, Authorization
或者这个
nginx.ingress.kubernetes.io/auth-response-headers: Authorization
我尝试按照
oidc: issuer did not match the issuer returned by provider, expected "https://your-tenant-name.b2clogin.com/tfp/c5b28ff6-f360-405b-85d0-8a87b5783d3b/B2C_1A_signin/v2.0/" got "https://your-tenant-name.b2clogin.com/c5b28ff6-f360-405b-85d0-8a87b5783d3b/v2.0/“ ( no policy name in the url)
I'm aware that a few of the mainstream providers such as Microsoft doesn't strictly follow this pattern but you'll have to take it up with them, or consider the workarounds given by the OIDC library.
还好oauth2-proxy supports --skip-oidc-discovery 参数: 绕过 OIDC 端点发现。 --login-url、--redeem-url 和 --oidc-jwks-url 必须在这种情况下配置。
参数示例如下:
- --skip-oidc-discovery=true
- --login-url=https://<mynamespace>.b2clogin.com/<mynamespace>.onmicrosoft.com/
b2c_1a_signin/oauth2/v2.0/authorize
- --redeem-url=https://<mynamespace>.b2clogin.com/<mynamespace>.onmicrosoft.com/
b2c_1a_signin/oauth2/v2.0/token
- --oidc-jwks-url=https://<mynamespace>.b2clogin.com/<mynamespace>.onmicrosoft.com/
b2c_1a_signin/discovery/v2.0/keys
要创建 scope,我必须通过“App Registrations”和“Expose an API”在 Azure B2C 中设置应用程序 ID URI。
(例如,参见 https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-web-api-dotnet?tabs=app-reg-ga#configure-scopes)。
我还必须按照 https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-web-api-application?tabs=app-reg-ga#grant-permissions (see also
- —scope=https://<mynamespace>.onmicrosoft.com/<myappname>/<scopeName> openid
您还应该指定
- —oidc_issuer_url=https://<mynamespace>.b2clogin.com/<TenantID>/v2.0/
在oidc_issuer_url中使用Directory/tenantId满足callback/redeem阶段的验证,不需要设置useinsecure_oidc_skip_issuer_verification=true。
另请注意,redirect-url=https:///oauth2/callback 应在 AAD B2C 中注册为应用程序重定向 URI(在应用程序概述中导航重定向 URI 的窗格 link)
根据
本地设置
version: "3.7"
services:
oauth2proxy:
image: quay.io/oauth2-proxy/oauth2-proxy:latest
command: >
--provider=oidc
--email-domain=*
--upstream=http://web
--http-address=0.0.0.0:9000
--redirect-url=http://localhost:9000
--reverse-proxy=true
--skip-provider-button=true
--session-store-type=redis
--redis-connection-url=redis://redis:6379
--oidc-email-claim=oid
--scope="https://<mynamepsace>.onmicrosoft.com/<app registration uuid>/read openid"
--insecure-oidc-skip-issuer-verification=true
--oidc-issuer-url=https://<mynamespace>.b2clogin.com/<mynamepsace>.onmicrosoft.com/<policy>/v2.0/
environment:
OAUTH2_PROXY_CLIENT_ID: "<app registration client id>"
OAUTH2_PROXY_CLIENT_SECRET: "<app registration client secret>"
OAUTH2_PROXY_COOKIE_SECRET: "<secret follow oauth2-proxy docs to create one>"
ports:
- "9000:9000"
links:
- web
web:
image: kennethreitz/httpbin
ports:
- "8000:80"
redis:
image: redis:latest
这里的重要部分是这些选项:
--oidc-email-claim=oid
--scope="https://<mynamepsace>.onmicrosoft.com/<app registration uuid>/read openid"
--insecure-oidc-skip-issuer-verification=true
--oidc-issuer-url=https://<mynamespace>.b2clogin.com/<mynamepsace>.onmicrosoft.com/<policy>/v2.0/
使用 --insecure-oidc-skip-issuer-verification=true
可让您跳过使用 --login-url --redeem-url --oidc-jwks-url
.
--oidc-email-claim=oid
替换了
--user-id-claim=oid
正如 Mark 所解释的那样,也需要范围。
Azure AD B2C 设置
这些是在 Azure AD B2C 门户中执行所需的总结步骤:
- 在用户流程中,转到“应用程序声明”并启用“用户的对象 ID”。这是使
--oidc-email-claim=oid
设置生效所必需的 - 在应用程序注册中,在“API 权限”中,创建一个名称为
read
的新权限。这个权限的url是你需要填写的值--scope="..."
。