" Invalid_grant"使用Twinfield Openid Oauth连接时的响应

时间:2018-06-11 09:28:27

标签: php openid-connect lumen-5.4 twinfield

这是我使用https://github.com/php-twinfield/

的库

当我调用Oauth登录时,这是一个问题。我已经使用用户名和密码完成了几乎所有API,但客户希望使用Oauth。我认为redirectUri存在问题。当我打电话给Oauth时,它总是显示:

{
    "success": false,
    "error": "invalid_grant"
}

这是我的凭证。 Clientid和clientsecret是从邮件中获取的,并且是从Openid Twinfield链接中设置的重定向uri。如果凭证有任何问题,请纠正我。

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;
}

2 个答案:

答案 0 :(得分:1)

首先,invalid_grant是标准的OAuth 2.0错误参数。由于OpenID Connect是基于OAuth 2.0构建的,因此接收此响应是有效的。如果您查看5.2 Error Response section,则可以找到以下说明

  

<强> invalid_grant

     

提供的授权许可(例如,授权                  代码,资源所有者凭据)或刷新令牌                  无效,已过期,已撤销,与重定向不匹配                  授权请求中使用的URI,或者发给的URI                  另一个客户。

正如它解释的那样,它可以是重定向URI,资源所有者凭据。但是我发现您的代码与授权代码有关。

    // Here pass the authorization code 
    $accessToken  = $provider->getAccessToken("authorization_code", ["code" =>'NLA000067']);

您使用的是硬编码的 authorization_code (NLA000067)吗?这是错的。授权代码授权的第一步是获取授权代码。然后,只有您可以执行令牌请求。您从授权请求中获取授权代码,我不认为您这样做。

如果是这种情况,您获得的错误响应完全有效。如上所述,invalid_grant是由无效授权码产生的。

p.s-可以this链接指导您更正问题

答案 1 :(得分:1)

@AnandPandey,请按照以下步骤操作

步骤1:

您首先需要构建要调用的URL,才能连接到Twinfield。为此,您应该具有如下所示的网址。

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)应该显示如上所示的 scope 参数,并且其值应与上面给出的值相同

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的响应