Это библиотека, которую я использовал https://github.com/php-twinfield/
Это проблема, когда я вызываю логин Oauth. Я завершил почти API с именем пользователя и паролем, но клиент хочет это с Oauth. Я думаю, что есть проблема в redirectUri. Когда я звонил Oauth, это всегда показывало:
{
"success": false,
"error": "invalid_grant"}
Это мои полномочия. Clientid и clientsecret получают из почты и URI перенаправления, установленного по ссылке Openid Twinfield. Пожалуйста, поправьте меня, если что-то не так в учетных данных.
clientId : Demorent
clientSecret : /iY7gyWn3Hkdgs4XzUG66SDyPNkk177x3A==
redirectUri : https://www.oauth.client.redirect.uri.com
Код, который используется:
public function login(\Illuminate\Http\Request $request)
{
try {
// In the $request param all the credential given
$provider = new \PhpTwinfield\Secure\Provider\OAuthProvider([
'clientId' => $request->clientId,
'clientSecret' => $request->clientSecret,
'redirectUri' => $request->redirectUri
]);
// Here pass the authorization code
$accessToken = $provider->getAccessToken("authorization_code", ["code" =>'NLA000067']);
$refreshToken = $accessToken->getRefreshToken();
$office = \PhpTwinfield\Office::fromCode("1008");
$connection = new \PhpTwinfield\Secure\OpenIdConnectAuthentication($provider, $refreshToken, $office);
$customerApiConnector = new \PhpTwinfield\ApiConnectors\CustomerApiConnector($connection);
$result = $customerApiConnector->get('1008',$office);
$jsonResponse = JsonResponse::success($result);
} catch(SoapFault $e) {
$jsonResponse = empty($e->getMessage()) ? JsonResponse::error(class_basename($e)) : JsonResponse::error($e->getMessage());
}
return $jsonResponse;
}
Начать, invalid_grant
стандартный параметр ошибки OAuth 2.0 Поскольку OpenID Connect построен на OAuth 2.0, этот ответ действителен. Если вы проверите 5.2 Раздел об ошибках, Вы найдете ниже объяснение
invalid_grant
Предоставленный грант авторизации (например, авторизация
код, учетные данные владельца ресурса) или токен обновления
недействителен, истек, отозван, не соответствует перенаправлению
URI, использованный в запросе авторизации или выданный
другой клиент.
Как это объясняется, это может быть что угодно от перенаправления URI, учетных данных владельца ресурса. Но я вижу некоторые проблемы с вашим кодом, связанные с кодом авторизации.
// Here pass the authorization code
$accessToken = $provider->getAccessToken("authorization_code", ["code" =>'NLA000067']);
Вы используете жесткий код Код авторизации (NLA000067)? Это не верно. Первым шагом предоставления кода авторизации является получение кода авторизации. Только тогда вы можете выполнить запрос токена. Вы получаете код авторизации из запроса авторизации, и я не вижу, что вы делаете это.
Если это так, то ответ об ошибке, который вы получаете, полностью действителен. Как объяснено выше invalid_grant
является результатом неверного кода авторизации.
p.s- может быть этот ссылка поможет вам решить проблему
@ AnandPandey, следуйте инструкциям ниже
ШАГ 1:
Сначала вам нужно создать URL, который вы бы вызвали, чтобы подключиться к Twinfield. И для этого у вас должен быть URL, как показано ниже.
https://login.twinfield.com/auth/authentication/connect/authorize?
client_id=Demorent
&client_secret=/iY7gyWn3Hkdgs4XzUG66SDyPNkk177x3A==
&redirect_uri=https://www.oauth.client.redirect.uri.com
&response_type=code
&force_login=0
&scope=openid+twf.user+twf.organisation+twf.organisationUser+offline_access
&state=STATELESS
&nonce=nonce
Замечания:
1) redirect_uri должно быть точно таким же, как вы зарегистрировались в Twinfield.
2) объем параметр, как показано выше, должен присутствовать и иметь то же значение, что и приведенное выше.
3) подтвердите ваш client_id & client_secret
Если все пойдет хорошо, вам будет показана страница входа в Twinflield, где вам нужно будет войти, используя свои учетные данные. После успешного входа вы будете перенаправлены на страницу разрешений, чтобы в основном предоставить доступ к вашему приложению для доступа к данным Twinfield.
Как только вы нажмете «Разрешить», вы будете перенаправлены обратно на конечную точку, которую вы указали с помощью кода авторизации.
ШАГ 2:
Следующий шаг — вызвать Twinfield accessTokenUri.
https://login.twinfield.com/auth/authentication/connect/token
со следующими заголовками
header.add("code",authorizationCodeFromStep1);
header.add("redirect_uri", yourRegisteredRedirectUri);
header.add("grant_type", "authorization_code");
header.add("client_id", "Demorent");
header.add("client_secret", "/iY7gyWn3Hkdgs4XzUG66SDyPNkk177x3A==");
Если все переданные выше параметры верны, вы получите ответ с id_token, accessToken, refreshToken, token_type и expires_in