php - 如何在Microsoft graph API中使用用户的访问 token 或基于租户ID的访问 token ?

标签 php laravel azure-active-directory microsoft-graph-api microsoft-entra-id

enter image description here enter image description here 以下是我使用 Microsoft Graph API 尝试的方法及其各自的结果:

方法一:

  • 单点登录 (SSO) 后,我们将获得访问 token 。
  • 此访问 token 用作 Graph API 集成的不记名 token 。
    public function redirectToMicrosoft(){
        return Socialize::driver('graph')->scopes(['offline_access'])->redirect();
        }

    public function handleMicrosoftCallback(){   
        $user = Socialize::driver('graph')->user();
        return $user->access_token;
    }

方法2:

  • 根据租户 ID 和指定参数获取访问 token 。
  • 使用获取的访问 token 。

    public function getAccessToken()
    {
        $tenantId = env('MICROSOFT_TENANT_ID');
        $clientSecret = env('MICROSOFT_CLIENT_SECRET');
        $clientId = env('MICROSOFT_CLIENT_ID');        
    
        $input = [
            'grant_type' => 'client_credentials',
            'client_id' => $clientId,
            'scope' =>"https://graph.microsoft.com/.default",
            'client_secret' => $clientSecret,
        ];
      
        $client = new Client();
        $response = $client->request('POST', "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token", ['form_params' => $input]);
     
        $statusCode = $response->getStatusCode();
        $responseBody = json_decode($response->getBody(), true);
    
        $this->accessToken = $responseBody['access_token'];
        return $responseBody;
    }

更新:

请找到下面的权限, enter image description here

尝试使用 Azure AD 配置的电子邮件登录时,这涉及注册电子邮件地址以获取客户端和 key 。我得到了代码,并且访问 token API 工作正常。

enter image description here

尝试使用不同的 Outlook 邮件登录时,出现以下错误。请引用截图,

enter image description here

代码 0.AS4AgI6YLYEIu0eXbgo3fHk6PszspcPofddJs-W7b5ajEO-5AC8.AgABAAIAAAAmoFfGtYxvRrNriQdPKIZ-AgDs_wUA9P-kBJSNPkGJJsNJgB510cZ69mO3JTSYLh89i4PpBhv1Y8L0nk51BF cTUh7bEe2i5dC24W1eeEqsOCuGKJCUYbmfdHCKHkpnaUBAFoHsIGhyydpHwMvezF4pAnL8_-OxgJeM-xPaj3WFxqZfEvwP6R4TFxQ4IP5hovS1erTxlMCS63dA9hdL7jbkpDHjrp3wgqs01zRt _q5RAPCH4KtRGtirnMnll-3PSEkcLixKUQkeC261Z_0JSK5aGRIDAv0IFNs_nw5cPtowTEuEiv99EJZQLJbt7qLOhz0DIPBBeBhpJl2bi6OsdOV4UZ59eQafOEanxA-5_pC6gy3H3nc9kiVfPddlneBXKGbFbaoXH yl9hi_i7bzNcJDubNteM2TQETYy7VgnoRpNEbh_eOZNV4T1rVtr8h5F4fxg9MaWkmQog8s9dxtDwY4MCYq9UBb1tVTeOlm38w3oyQWR-3ZCbD8wV4IZV3TEzrqJfhURm8E_cgcgTLdzOm-8uK9f -E0NAC4aodqXf_V3d8wLtR6QJi-WNOKlB-8THR-WNuMZvBcZiL38h_zToPbgwnL0fSRfsuoU57kwE8t30HpcDzRq2PilxgdDjoGolStRNEv-RDrgTS-66EewjHevBwbU_5A0nSfNzjhksl5N QfuEdnoRSZ3QTH4jwLgzIZ3aSkwphkoRtDJRa_Ri1U8PdAzolRl2SlJIYp7sqvIfpPL9SSRgEA6ftusb8seE9gEcGXKvvRFEQza4KgrsC9NHNMQunJFlQxbb5Y1SpdgRWC9BsK7oIGgegj5F4CKoBgKqlaOmis2 I_QvZxVil5KSq4zft&state=12345&session_state=9c29347d-1351-48c8-90dc-c1ab380a6221

最佳答案

Note that, you cannot fetch personal Outlook calendar events using token generated with client credentials flow.

You need to switch to delegated flows like authorization code flow by granting delegated permissions with /common endpoint.

就我而言,我使用以下帐户类型注册了一个 Multi-Tenancy 应用程序,该应用程序同时允许组织和个人 Microsoft 帐户:

enter image description here

现在,我在该应用程序中授予了Calendars.ReadWrite类型的委托(delegate)权限,如下所示:

enter image description here

最初,我在登录后显示同意屏幕的浏览器中运行了以下授权请求:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize? 
client_id=appId
&redirect_uri=https://jwt.ms
&response_type=code  
&response_mode=query  
&scope=https://graph.microsoft.com/.default
&state=12345

enter image description here

接受同意后,我在地址栏中获得了授权code值:

enter image description here

现在,我通过 Postman 使用授权代码流生成了访问 token ,其中包含以下参数,包括code值:

POST https://login.microsoftonline.com/tenantId/oauth2/v2.0/token
grant_type: authorization_code
client_id: appId 
client_secret: secret 
scope: https://graph.microsoft.com/.default
code: paste_code_from_above
redirect_uri: https://jwt.ms

回应:

enter image description here

当我使用此 token 获取个人 Outlook 日历用户的事件时,我成功获得了响应,如下所示:

GET https://graph.microsoft.com/v1.0/me/events

回应:

enter image description here

如果您尝试在普通 Azure AD 用户帐户中列出或创建事件,请确保为该用户分配有效的 Office 365 许可证

更新:

请注意,错误无效请求。如果您在 token 参数中传递无效值,通常会发生请求格式错误或无效

代码中传递无效额外字符时,我遇到了相同的错误> 生成 token 时的参数如下:

enter image description here

要解决此错误,您应该从 code 参数中删除这部分 &state=12345&session_state=9c29347d-1351-48c8-90dc-c1ab380a6221

您的有效代码值应为:

enter image description here

关于php - 如何在Microsoft graph API中使用用户的访问 token 或基于租户ID的访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77431323/

相关文章:

azure - Azure Active Directory 应用程序上下文中的 "delegated permissions"是什么?

azure - Office 365、oauth2,在哪里可以找到 Key+Secret?

php - 将变量从一个 Controller Action 传递到另一个

php - PHP preg_match数组并回显匹配项

php - Laravel save() - 插入数据而不是更新

Laravel 5 模型继承 - 获取子模式时返回父数据

javascript - PHP:在网络浏览器中输出 system/Shell_exec 命令输出

php - 找不到 CodeIgniter CI_Controller

php - Eloquent 访问器和属性命名

azure - 应用程序可以使用 AD 身份验证而不是连接字符串 key 来访问 Azure Cosmos