这是我使用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;
}
答案 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的响应