如何配置Omniauth对接Azure B2C实现OpenID Connect隐式流登录
你提出的host搭配自定义authorization_endpoint的配置方式是可行的,但手动维护所有OIDC端点容易出现路径拼写错误,更推荐直接使用Azure B2C兼容的OIDC发现端点自动完成配置,以下是具体方案:
方案1:手动指定端点配置
你设想的配置逻辑完全可以正常工作,需要注意的是,除了授权端点外,你还需要手动补全token端点、用户信息端点、公钥端点这几个必填配置,否则插件默认基于host拼接的路径不符合Azure B2C的路由规则。
其中公钥端点(jwks_uri)的路径前缀和其他接口不同,必须填写完整绝对地址,不能用相对路径。
config.omniauth :openid_connect, { name: :azure_b2c, scope: [:openid], response_type: :id_token, # Azure B2C默认返回sub作为用户唯一标识,若要使用preferred_username需要提前在B2C用户流的应用声明中开启该字段返回 uid_field: "sub", client_options: { port: 443, scheme: "https", host: "<your-tenant-name>.b2clogin.com", identifier: ENV["AZURE_B2C_CLIENT_ID"], redirect_uri: "http://yourapp.com/users/auth/azure_b2c/callback", # 路径内嵌策略ID的端点配置 authorization_endpoint: "/<your-tenant-name>.onmicrosoft.com/<your-policy-id>/oauth2/v2.0/authorize", token_endpoint: "/<your-tenant-name>.onmicrosoft.com/<your-policy-id>/oauth2/v2.0/token", userinfo_endpoint: "/<your-tenant-name>.onmicrosoft.com/<your-policy-id>/oauth2/v2.0/userinfo", jwks_uri: "https://<your-tenant-name>.b2clogin.com/<your-tenant-name>.onmicrosoft.com/<your-policy-id>/discovery/v2.0/keys" }, # 如果你选择使用带p参数的基础端点格式,注释掉上面路径中带策略ID的部分,改用基础路径,同时开启下面的参数配置即可 # authorize_params: { p: "<your-policy-id>" } }
方案2:使用OIDC发现端点自动配置(推荐)
Azure B2C完全兼容OpenID Connect发现规范,你只需要指定对应策略的发现端点,插件会在启动时自动拉取所有授权、token、公钥、用户信息等端点配置,不需要手动逐个填写,能避免绝大多数路径配置错误。
Azure B2C对应指定策略的发现端点固定格式为:https://<your-tenant-name>.b2clogin.com/<your-tenant-name>.onmicrosoft.com/<your-policy-id>/v2.0/.well-known/openid-configuration
对应的最简隐式流配置如下:
config.omniauth :openid_connect, { name: :azure_b2c, scope: [:openid], response_type: :id_token, uid_field: "sub", discovery: true, # 开启端点自动发现能力 client_options: { port: 443, scheme: "https", host: "<your-tenant-name>.b2clogin.com", identifier: ENV["AZURE_B2C_CLIENT_ID"], redirect_uri: "http://yourapp.com/users/auth/azure_b2c/callback", discovery_endpoint: "/<your-tenant-name>.onmicrosoft.com/<your-policy-id>/v2.0/.well-known/openid-configuration" } }
配置注意事项
- 隐式流场景下,必须提前进入Azure B2C的应用注册配置页,在「隐式流和混合流」配置块中勾选
ID 令牌选项,否则授权端点不会返回合法的id_token,会直接触发回调报错。 - 如果需要获取用户邮箱、显示名等额外信息,除了在
scope参数中添加对应权限外,还需要在对应B2C用户流策略的「应用声明」配置中勾选需要返回的字段,否则对应信息不会出现在id_token或用户信息接口返回中。 - 所有B2C相关接口请统一使用
<tenant-name>.b2clogin.com域名,不要使用旧版login.microsoftonline.com域名,避免后续出现兼容性问题。
内容的提问来源于stack exchange,提问作者Appleoddity
相关产品推荐
相关产品推荐

