You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure AD B2C创建ROPC用户流并在Postman/Laravel获取令牌

Azure AD B2C ROPC认证流配置与调用实现

你之前遇到的报错参考如下:
ROPC调用报错截图

第一步:创建支持ROPC的B2C用户流

  • 登录Azure门户,切换到目标Azure AD B2C租户
  • 左侧菜单选择「用户流」,点击「新建用户流」
  • 流类型选择资源所有者密码凭据(ROPC),不要选择普通注册登录、密码重置等其他类型流,ROPC是独立的流类型
  • 自定义流名称(例如B2C_1_ROPC_Auth),勾选需要返回的用户声明(如用户ID、邮箱、显示名),身份提供程序仅勾选「本地账户」,ROPC流不支持社交身份提供程序
  • 创建完成后进入流的属性页,确认「启用资源所有者密码凭据流」开关为开启状态
  • 返回B2C「应用注册」页面,找到你要调用的目标应用,进入「身份验证」页,将公共客户端/原生客户端分类下的「允许公共客户端流」开关设为「是」,ROPC调用必须开启该配置
  • 进入应用的「API权限」页,添加需要的委托权限(至少包含openid、offline_access,如果要调用Microsoft Graph则添加对应Graph权限),完成后点击「授予管理员同意」

第二步:Postman调用获取令牌

  • 请求方法选POST,请求地址格式:https://<B2C租户名>.b2clogin.com/<B2C租户ID>/<ROPC用户流全名>/oauth2/v2.0/token
  • 请求头添加:Content-Type: application/x-www-form-urlencoded
  • 请求体使用form-urlencoded格式传参:
    • grant_type:固定值password
    • client_id:B2C应用注册的客户端ID
    • client_secret:Web应用填「证书和密码」页创建的客户端密钥,原生公共客户端可留空
    • scope:格式为https://<B2C租户名>.onmicrosoft.com/<客户端ID>/<自定义权限> openid offline_access,调用Microsoft Graph则替换为对应Graph委托权限
    • username:B2C本地账户的用户名/邮箱
    • password:对应账户密码
  • 发送请求即可返回access_token、refresh_token等字段。

第三步:Laravel控制器实现调用

直接使用Laravel自带HTTP客户端即可,无需额外安装SDK,示例代码如下:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;

class AuthController extends Controller
{
    public function getRopcToken(Request $request)
    {
        $validated = $request->validate([
            'username' => 'required|string',
            'password' => 'required|string',
        ]);

        $b2cConfig = config('services.b2c');
        $tokenEndpoint = "https://{$b2cConfig['tenant_name']}.b2clogin.com/{$b2cConfig['tenant_id']}/{$b2cConfig['ropc_flow']}/oauth2/v2.0/token";

        $response = Http::asForm()->post($tokenEndpoint, [
            'grant_type' => 'password',
            'client_id' => $b2cConfig['client_id'],
            'client_secret' => $b2cConfig['client_secret'],
            'scope' => "https://{$b2cConfig['tenant_name']}.onmicrosoft.com/{$b2cConfig['client_id']}/user.read openid offline_access",
            'username' => $validated['username'],
            'password' => $validated['password'],
        ]);

        if ($response->failed()) {
            return response()->json([
                'code' => 400,
                'msg' => '令牌获取失败',
                'error_detail' => $response->json()
            ], 400);
        }

        return $response->json();
    }
}

在config/services.php中添加B2C配置项:

'b2c' => [
    'tenant_name' => env('B2C_TENANT_NAME'),
    'tenant_id' => env('B2C_TENANT_ID'),
    'ropc_flow' => env('B2C_ROPC_FLOW'),
    'client_id' => env('B2C_CLIENT_ID'),
    'client_secret' => env('B2C_CLIENT_SECRET'),
],

在.env文件中填写对应配置参数即可。

常见报错对应排查点

  • 错误码AADB2C90057:未开启应用的公共客户端流允许开关
  • 错误码AADB2C90068:客户端ID与租户不匹配,或scope参数格式错误
  • 错误码AADB2C90118:用户名密码错误,或登录账号为社交身份账号(ROPC仅支持本地账户)
  • 错误码unsupported_grant_type:使用的用户流不是ROPC类型,需重新创建专属ROPC用户流

注意:ROPC属于高风险认证流,仅适用于后端服务、用户完全信任的自有客户端场景,生产环境优先使用授权码流。

内容的提问来源于stack exchange,提问作者amir tariq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:27:27