如何在Microsoft Graph API中使用用户AccessToken或基于Tenant ID的AccessToken
方法1:通过SSO获取Access Token调用API
- 单点登录(SSO)后获取Access Token
- 将该Access Token作为Bearer Token调用Graph API
public function redirectToMicrosoft(){ return Socialize::driver('graph')->scopes(['offline_access'])->redirect(); } public function handleMicrosoftCallback(){ $user = Socialize::driver('graph')->user(); return $user->access_token; }
调用结果错误:
- 请求地址:
https://graph.microsoft.com/v1.0/me/onenote/pages- 错误代码:40001
- 错误信息:"请求不包含有效的身份验证令牌。"
- 请求地址:
https://graph.microsoft.com/v1.0/users/gowrishankari97@outlook.com/events- 错误代码:ErrorAccessDenied
- 错误信息:"访问被拒绝。请检查凭据并重试。"
方法2:通过租户ID等参数获取Access Token调用API
- 基于Tenant ID和指定参数获取Access Token
- 使用获取到的Access Token调用API
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; }
调用结果错误:
- 请求地址:
https://graph.microsoft.com/v1.0/me/events- 错误代码:BadRequest
- 错误信息:"/me 请求仅在委托身份验证流中有效。"
- 请求地址:
https://graph.microsoft.com/v1.0/users/gowrishankari97@outlook.com/events- 错误代码:OrganizationFromTenantGuidNotFound
- 错误信息:"租户GUID '{TENANT_ID}' 对应的租户不存在。"
更新内容
- 权限配置截图:显示已配置的Microsoft Graph权限
- 使用Azure AD配置的邮箱登录时,可正常获取授权码,Access Token API运行正常(对应登录成功截图)
- 使用其他Outlook邮箱登录时,出现错误(对应登录失败截图)
授权码:
0.AS4AgI6YLYeIu0eXbgo3fHk6PszspcPofddJs-W7b5ajEO-5AC8.AgABAAIAAAAmoFfGtYxvRrNriQdPKIZ-AgDs_wUA9P-kBJSNPkGJJsNJgB510cZ69mO3JTSYLh89i4PpBhv1Y8L0nk51BFcTUh7bEe2i5dC24W1eeEqsOCuGKJcUYbmfdHCKHkpnaUBAFoHsIGhyydpHwMvezF4pAnL8_-OxgJeM-xPaj3WFxqZfEvwP6R4TFxQ4IP5hovS1erTxlMCS63dA9hdL7jbkpDHjrp3wgqs01zRt_q5RAPCH4KtRGtirnMnll-3PSEkcLixKUQkeC261Z_0JsK5aGRidAv0IFNs_nw5cPtowTEuEiv99EJZQLJbt7qLOhz0DIPBBeBhpJl2bi6OsdOV4UZ59eQafOEanxA-5_pC6gy3H3nc9kiVfPddlneBXKGbFbaoXHyl9hi_i7bzNcJDubNteM2TQETYy7VgnoRpNEbh_eOZNV4T1rVtr8h5F4fxg9MaWkmQog8s9dxtDwY4MCYq9UBb1tVTeOlm38w3oyQWR-3ZCbD8wV4IZV3TEzrqJfhURm8E_cgcgTLdzOm-8uK9f-E0NAC4aodqXf_V3d8wLtR6QJi-WNOKlB-8THR-WNuMZvBcZiL38h_zToPbgwnL0fSRfsuoU57kwE8t30HpcDzRq2PilxgdDjoGolStRNEv-RDrgTS-66EewjHevBwbU_5A0nSfNzjhksl5NQfuEdnoRSZ3QTH4jwLgzIZ3aSkwphkoRtDJRa_Ri1U8PdAzolRl2SlJIYp7sqvIfpPL9SSRgEA6ftusb8seE9gEcGXKvvRFEQza4KgrsC9NHNMQunJFlQxbb5Y1SpdgRWC9BsK7oIGgegj5F4CKoBgKqlaOmis2I_QvZxVil5KSq4zft&state=12345&session_state=9c29347d-1351-48c8-90dc-c1ab380a6221
内容的提问来源于stack exchange,提问作者Shankari

