Azure AD B2C + oauth2_proxy认证缺失邮箱及令牌解码问题
首先得澄清一个关键点:你拿到的那个code不是标准JWT令牌,而是Azure B2C返回的加密授权代码,这就是为什么用jwt.ms解码失败的原因——它本来就不是JWT格式。
关于授权代码的解码说明
你看到的code=eyJraWQi...是分段的Base64 URL编码串,但只有第一段是可读的元数据(也就是你解码出的{"kid":"cpimcore_09252015","ver":"1.0","zip":"Deflate","ser":"1.0"}),后面的段落都是加密内容。这些加密部分只有Azure B2C自身能解密,当oauth2_proxy调用你配置的REDEEM_URL(令牌端点)时,会用你的客户端ID和密钥去交换真正的ID Token/Access Token,这时候才能拿到包含用户信息的明文JWT。所以你完全不需要自己解码这个授权代码,oauth2_proxy会自动处理这个步骤。
解决"missing email"错误
这个错误的核心是oauth2_proxy在交换得到的ID Token里找不到它默认期望的email字段,按以下步骤排查解决:
检查B2C用户流的应用程序声明
登录Azure门户进入你的B2C租户,找到你使用的用户流(b2c_1_policy):- 切换到应用程序声明选项卡
- 确保勾选了
Email Addresses选项,保存用户流。这样Azure B2C会在ID Token里返回emails字段(是一个数组,因为用户可能关联多个邮箱)。
配置oauth2_proxy识别正确的邮箱声明
oauth2_proxy默认会查找email字段,但Azure B2C返回的是emails数组,所以需要添加环境变量配置:- name: OAUTH2_PROXY_EMAIL_CLAIM value: emails这个配置会让oauth2_proxy从
emails数组里取第一个邮箱作为用户的邮箱标识。验证客户端配置正确性
确保oauth2_proxy配置里的OAUTH2_PROXY_CLIENT_ID和OAUTH2_PROXY_CLIENT_SECRET完全匹配Azure B2C应用注册里的应用程序(客户端)ID和客户端密码,如果密钥过期或者不匹配,也可能导致令牌交换异常,间接引发邮箱字段缺失的错误。
完成以上配置后重启oauth2_proxy服务,应该就能解决回调时的"missing email"错误了。
内容的提问来源于stack exchange,提问作者user3151902

