Ответ "Invalid_grant" при использовании Twinfield Openid Oauth connect

Это библиотека, которую я использовал 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;
}

1 ответ

@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

Начать, 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 является результатом неверного кода авторизации.

ps- Может быть, эта ссылка поможет вам исправить проблему

Другие вопросы по тегам