以下是我使用 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;
}
- 导致以下错误:
- 网址:https://graph.microsoft.com/v1.0/me/onenote/pages
- 回复:
- 错误代码:40001
- 错误消息:“请求不包含有效的身份验证 token 。”
- 网址:https://graph.microsoft.com/v1.0/users/[email protected]/events
- 回复:
- 错误代码:ErrorAccessDenied
- 错误消息:“访问被拒绝。请检查凭据并重试。”
方法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;
}
- 导致以下错误:
- 网址:https://graph.microsoft.com/v1.0/me/events
- 回复:
- 错误代码:BadRequest
- 错误消息:“/me 请求仅在委托(delegate)身份验证流程中有效。”
- 回复:
- 网址:https://graph.microsoft.com/v1.0/users/[email protected]/events
- 回复:
- 错误代码:OrganizationFromTenantGuidNotFound
- 错误消息:“租户 GUID '{TENANT_ID}' 的租户不存在。”
- 回复:
- 网址:https://graph.microsoft.com/v1.0/me/events
更新:
尝试使用 Azure AD 配置的电子邮件登录时,这涉及注册电子邮件地址以获取客户端和 key 。我得到了代码,并且访问 token API 工作正常。
尝试使用不同的 Outlook 邮件登录时,出现以下错误。请引用截图,
代码 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 帐户:
现在,我在该应用程序中授予了Calendars.ReadWrite
类型的委托(delegate)权限,如下所示:
最初,我在登录后显示同意屏幕的浏览器中运行了以下授权请求:
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
接受同意后,我在地址栏中获得了授权code
值:
现在,我通过 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
回应:
当我使用此 token 获取个人 Outlook 日历用户的事件时,我成功获得了响应,如下所示:
GET https://graph.microsoft.com/v1.0/me/events
回应:
如果您尝试在普通 Azure AD 用户帐户中列出或创建事件,请确保为该用户分配有效的 Office 365 许可证。
更新:
请注意,错误无效请求。如果您在 token 参数中传递无效值,通常会发生请求格式错误或无效
。
在代码
中传递无效或额外字符时,我遇到了相同的错误> 生成 token 时的参数如下:
要解决此错误,您应该从 code
参数中删除这部分 &state=12345&session_state=9c29347d-1351-48c8-90dc-c1ab380a6221
您的有效代码
值应为:
关于php - 如何在Microsoft graph API中使用用户的访问 token 或基于租户ID的访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77431323/