- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Kubernetes 新手,我一直在学习 Ingress。在 Ingress 处理 TLS 证书和身份验证的想法给我留下了深刻的印象。我添加了一个简单的静态文件服务器,并添加了cert-manager,所以我基本上有了一个HTTPS静态网站。
我读到 NGINX 入口 Controller 可以与 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 回调期间兑换代码时出错: token 交换:oauth2:服务器响应缺少 access_token
我的 Azure B2C 审核日志显示它正在颁发 id_tokens。
当我查看 oauth2_proxy 的源代码时,看起来好像问题发生在 oauth2.config.Exchange() 期间 - 它位于 goloang 库中 - 我不知道它的作用,但我不知道认为它可以与 Azure B2c 正常配合。有人知道我如何从这里进步吗?
谢谢。
标记
最佳答案
我求助于在 VSCode 中编译和调试代理应用程序。我运行了一个简单的 NGINX 代理来向代理提供 TLS 终止,以允许 Azure B2C 端运行。事实证明我做错了很多事情。以下是我解决的问题列表,希望其他人能够使用它通过 Azure B2C 运行自己的 oauth_proxy。
当附加到调试器时,很明显,oauth2_proxy 会读取 token 并期望依次找到 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 入口日志确实有一条消息,表明 header 超过 8K,因此 NGinX 报告 503 错误。
在 oauth2-proxy 文档中,有一个描述,如果您的 cookie 很长,则应使用 Redis 存储 - 它特别将 Azure AD cookie 标识为足够长以保证 Redis 解决方案。
我安装了一个单节点 Redis 来使用此答案中的 YAML 配置进行测试(未强化)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
希望这可以节省人们很多时间。
标记
关于azure - 连接到 Azure B2C 时如何调试 oauth2_proxy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61148502/
我试图找到在庞大的代码库中创建 NaN 的位置。是否有一些编译器标志或我可以用来在 NaN 上 panic 的东西,这样我就可以找到它在哪一行? 最佳答案 没有编译器标志。你能做的最好的事情就是把你的
A类 class ClassA { @Autowired class ClassB; } 类配置: @Configuration class TestConfi
我是一名统计学研究生,经常使用 R。我熟悉其他编程环境中的 OOP。我什至在各种定义用于存储数据的新类的统计包中看到了它的使用。 在我研究生生涯的这个阶段,我通常会为一些类作业编写一些算法——一些接收
我想要两个不同的网络摄像头视频输出,一个是普通的网络摄像头镜头,另一个是它的“镜像”版本。 cv2可以吗? import time, cv2 video=cv2.VideoCapture(0) a=0
我创建了一个可以通过两种方式过滤的图库。一个通过单击按钮,另一个通过搜索过滤器。过滤器工作完美,除了当 div 隐藏在过滤器上时,其余显示的 div 不会彼此相邻 float 。 这是过滤前的样子:
我们作为一个 4 人团队工作,我们的项目部署在 openshift我们使用 git 存储库 进行提交、推送和 pull 。当有人提交更多更改时,其他人必须 pull 它以在我们的系统中进行更新。但是从
我正在尝试扩展自动完成功能,以便在选择某个项目时显示辅助标签。例如,给定显示项目的自动完成功能,项目名称将显示在包含代码的输入框旁边的 span 标记中。 查看自动完成源代码,我发现过滤值的下拉列表是
我有一个包含歌曲、艺术家和专辑实体的核心数据。 歌曲有可选的一对一关系艺术家到艺术家实体和专辑到专辑实体这两个实体都与 Song 实体具有反向关系。 相册有可选的一对一关系艺术家到艺术家实体和可选的一
XmlSerializer正在调用 IList.Add()在我的课上,我不明白为什么。 我有一个自定义类(层次结构中的几个类之一),其中包含我使用 XmlSerializer 与 XML 相互转换的数
我们在 Web 应用程序中定义了此事件,它创建了一个名为 timelineEventClicked 的自定义触发器 canvas.addEventListener('click', function
有大量资源可用于使用 Swift(可达性)检查有效的 Internet 连接,以及在进行 API 调用时检查 httpResponse 的 statusCode 的方法,但是检查和处理这些的“正确”方
谁能告诉我是否可以在 Controller 规范中 stub params[] 值,以便 Controller 接受 stub 值作为 View 中的实际 params[] 值。 例如,我的观点有一个
我的问题是没有在 UserControl 中连接 DependencyProperties。这不是问题。当我将 UserControl 中的按钮绑定(bind)到 UserControl 的 Depe
如何#define 路径 L"C:\Windows\System32\taskmgr.exe"来处理宽字符 #define TASK_MGR "C:\\Windows\\System32\\taskm
我正在尝试使用 Jasmine 和 Sion 编写单元测试,但是在使用 RequireJs 加载模块时我很难找到以下等效项: sinon.stub(window, "MyItemView"); 使用
我有一个包含三个 div 的示例页面,如下所示: 当浏览器大小达到 md 点并且第二个 div 高于第一个 div 时,第三个 div 开始在第一个的右侧
我在 C++ 端有 CString cs,在 C# 端有 IntPtr ip,它通过编码(marshal)处理机制包含 cs 的值。 然后,我只需将需要的字符串作为 Marshal.PtrToStri
我是一名优秀的程序员,十分优秀!