3

这是我使用的库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;
}
4

2 回答 2

1

首先,invalid_grant是一个标准的 OAuth 2.0 错误参数。由于 OpenID Connect 是基于 OAuth 2.0 构建的,因此接收此响应是有效的。如果您检查5.2 错误响应部分,您会发现以下说明

无效授予

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

正如它所解释的,它可以是来自重定向 URI、资源所有者凭据的任何内容。但我发现您的代码存在与授权代码相关的问题。

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

您使用的是硬编码的授权码(NLA000067) 吗?这是错误的。授权码授予的第一步是获取授权码。然后只有您可以执行令牌请求。您从授权请求中获取授权码,但我没有看到您这样做。

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

ps-这个链接可能会指导您纠正问题

于 2018-06-14T05:45:24.517 回答
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

如果一切顺利,您将看到 Twinflied 登录页面,您需要在其中使用您的凭据登录。成功登录后,您将被重定向到权限授予页面,基本上授予您的应用程序访问权限以访问 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 的响应

于 2019-02-12T14:16:37.593 回答