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

使用Laravel Socialite集成Microsoft OAuth时如何获取用户组织ID

Laravel Socialite集成Microsoft OAuth多租户认证问题
  • 在Laravel应用中使用Socialite实现Microsoft OAuth认证,多租户环境下需将用户分配至对应组织,但无法找到获取Microsoft组织ID或域名的方法
  • 尝试获取用户街道、邮编、城市信息未成功,其中公司标识(组织ID/域名)的获取优先级最高
  • 参考过Google OAuth获取组织ID的思路,也查阅了Microsoft官方的ID令牌文档和Microsoft Graph调用文档

解决步骤

1. 配置正确的权限范围(Scopes)

要获取组织信息,需在Socialite配置中添加对应的Microsoft Graph权限:

// config/services.php
'microsoft' => [
    'client_id' => env('MICROSOFT_CLIENT_ID'),
    'client_secret' => env('MICROSOFT_CLIENT_SECRET'),
    'redirect' => env('MICROSOFT_REDIRECT_URI'),
    'scopes' => [
        'openid',
        'profile',
        'email',
        'User.Read',
        'Organization.Read.All' // 关键权限,用于获取组织信息
    ],
],

2. 获取组织ID/域名

通过Socialite拿到用户实例后,调用Microsoft Graph API获取组织信息:

$user = Socialite::driver('microsoft')->user();
// 用access token调用Graph API获取组织列表
$response = Http::withToken($user->token)
    ->get('https://graph.microsoft.com/v1.0/organization');

$organizations = $response->json()['value'];
// 提取组织ID和域名
foreach ($organizations as $org) {
    $organizationId = $org['id'];
    $domain = $org['verifiedDomains'][0]['name']; // 取第一个验证域名
}

3. 获取用户地址信息

用户地址信息依赖User.Read权限,从Graph API的用户详情接口获取:

$userDetails = Http::withToken($user->token)
    ->get('https://graph.microsoft.com/v1.0/me');

$address = $userDetails->json()['businessAddress'] ?? null;
if ($address) {
    $street = $address['street'];
    $city = $address['city'];
    $postalCode = $address['postalCode'];
}

4. 快速获取租户ID(简化场景)

若仅需当前用户所属租户的ID,可直接从ID令牌的tid字段提取,无需调用Graph API:

$idTokenClaims = Socialite::driver('microsoft')->user()->getIdTokenClaims();
$tenantId = $idTokenClaims['tid'];

注意事项

  • 需确保Azure AD应用已获得Organization.Read.All权限(该权限需要管理员同意)
  • 多租户场景下,建议验证用户所属组织是否在应用允许的租户列表内

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:19