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

如何在Azure AD B2C OAuth2登录及ROPC API返回结果中获取用户Object ID

嘿,我来帮你搞定这个问题!你用的是Azure AD B2C的ROPC(Resource Owner Password Credentials)流获取token,要从返回结果里拿用户的Object ID其实很简单,核心是解析返回的id_token——因为它是一个JWT令牌,用户的Object ID就藏在里面的claims里。

获取Azure AD B2C ROPC流返回的用户Object ID

首先,先看看ROPC接口返回的典型响应结构大概是这样的:

{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6...",
  "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6...",
  "scope": "openid offline_access"
}

你需要重点关注id_token字段,它是一个由**头部(Header)、负载(Payload)、签名(Signature)**三部分组成的JWT,每部分用.分隔。用户的Object ID就存储在Payload里的oid声明中。

接下来分两种场景说明获取方式:

1. 快速验证(适合调试/测试)

如果你只是想快速查看Object ID,可以手动解码id_token的Payload部分:

  • 复制id_token中间的那段内容(第二个.分隔的部分)
  • 用Base64URL解码(注意:JWT用的是Base64URL编码,和标准Base64略有区别,比如+换成-,/换成_,去掉末尾的=)
  • 解码后得到的JSON里,oid字段的值就是用户的Azure AD B2C Object ID

举个解码后的Payload示例:

{
  "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  "oid": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  "name": "John Doe",
  "email": "john.doe@example.com",
  "exp": 1699999999,
  "iss": "https://patient360app.b2clogin.com/your-tenant-id/v2.0/",
  "aud": "your-client-id"
}

这里的oid就是你要找的用户Object ID。

2. 生产环境推荐方式(安全可靠)

在生产代码里,绝对不要手动解码JWT,一定要用成熟的JWT库来解析和验证令牌签名,确保令牌没有被篡改。下面给几个常用语言的示例:

JavaScript/TypeScript

使用jwt-decode库(先安装:npm install jwt-decode):

import jwtDecode from "jwt-decode";

// 发送ROPC请求获取token
const response = await fetch("https://patient360app.b2clogin.com/patient360app.onmicrosoft.com/oauth2/v2.0/token?p=B2C_1_ROPC_Auth", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    client_id: "你的客户端ID",
    username: "用户邮箱/账号",
    password: "用户密码",
    grant_type: "password",
    scope: "openid offline_access"
  })
});

const data = await response.json();
const decodedToken = jwtDecode(data.id_token);
const objectId = decodedToken.oid; // 这就是用户的Object ID

C#

使用System.IdentityModel.Tokens.Jwt库(NuGet安装:Microsoft.IdentityModel.Tokens):

using System.IdentityModel.Tokens.Jwt;
using System.Text.Json;

// 假设已获取到接口响应内容
var responseJson = await response.Content.ReadAsStringAsync();
var tokenResponse = JsonSerializer.Deserialize<TokenResponse>(responseJson);

var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadJwtToken(tokenResponse.IdToken);
var objectId = jwtToken.Claims.First(c => c.Type == "oid").Value;

// 辅助类,用于反序列化响应
public class TokenResponse
{
    public string IdToken { get; set; }
    public string AccessToken { get; set; }
    // 其他字段按需添加
}

关键注意事项

  • oid是Azure AD B2C中用户的全局唯一Object ID,而sub是用户在特定客户端下的主体ID,两者在多数场景下值相同,但如果用户关联多个客户端,sub可能会有差异,所以要获取用户的全局唯一标识,一定要用oid。
  • 生产环境中必须验证JWT的签名、颁发者(iss)、受众(aud)等参数,避免使用无效或被篡改的令牌。

内容的提问来源于stack exchange,提问作者3iL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:34:14