Я работаю в Graph API, который позволяет пользователю войти через свою учетную запись Microsoft. Я следую за Начните с Microsoft Graph в приложении PHP
статья.
Теперь я не новичок в Laravel, но я не могу понять проблему. Я использую пакет League OAuth2. И по ссылке выше я должен получить токен доступа перед установлением соединения. Теперь я много занимался поиском отладки, и вот что я нашел.
$token = $this->createAccessToken($prepared, $grant);
Когда он пытается создать токен, он проверяет, access_token
существует до этого или нет. Теперь я понимаю, что access_token
будет сгенерирован из этого метода. Так как это могло уже существовать. Может кто-нибудь, пожалуйста, помогите мне с этим?
Вот мой код маршрута:
Route::get('/oauth', function (Request $request) {
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => 'client_id',
'clientSecret' => 'secret_key',
'redirectUri' => 'http://localhost:8000/oauth',
'urlAuthorize' => 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
'urlAccessToken' => 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
'urlResourceOwnerDetails' => '',
'scopes' => 'openid'
]);
if (!$request->has('code')) {
return redirect($provider->getAuthorizationUrl());
} else {
$accessToken = $provider->getAccessToken('authorization_code', [
'code' => $request->input('code')
]);
exit($accessToken->getToken());
}
});
Благодарю.
Обновить
Теперь я делаю запрос CURL, как это
$url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
$data = 'grant_type=authorization_code';
$data .= '&code=' . $request->input('code');
$data .= '&client_id=id_here';
$data .= '&client_secret=secret_here';
$data .= '&redirect_uri=http://localhost:8000/oauth';
$data .= '&scopes=openid user.read';
$additional_headers = array(
'Content-Type' => 'application/x-www-form-urlencoded'
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $additional_headers);
$server_output = curl_exec ($ch);
dd($server_output);
Но вывод / ответ этого запроса CURL получает объект ‘token_id’. Вместо access_token & expiry_in …
Вы не создаете токен доступа, он предоставляется провайдером аутентификации (в данном случае Microsoft).
С authorization_code
поток вы технически получаете код авторизации. Затем вы отправляете этот код авторизации обратно на сервер, чтобы обменять его на токен доступа. Затем вы передаете этот токен доступа в заголовке авторизации ваших вызовов в Microsoft Graph API.
У меня есть учебник по конечной точке v2, в котором рассказывается, как OAUTH-процесс работает с потоком кода авторизации, который может оказаться полезным: Учебник для конечных точек Microsoft v2.
ОБНОВИТЬ:
Вы не можете использовать такой инструмент, как curl
оформить код авторизации. Первый звонок /authorize
это GET
это приводит к веб-странице, на которую пользователь входит. После этого поставщик аутентификации перенаправляет пользователя обратно на ваш веб-сервер, который затем выдает POST
к /token
конечная точка.
Если вы хотите использовать curl
(или любой другой сценарий на стороне клиента), вам нужно использовать неявное предоставление. У меня есть аналогичная прогулка для этого: Конечная точка v2 и неявное предоставление.
Других решений пока нет …