使用PHP客户端与Google API客户端一起刷新令牌时出现“ unauthorized_client”错误?

时间:2019-01-15 08:58:35

标签: php ios google-api google-oauth google-api-php-client

我正在请求使用GoogleSignIn窗格中的代码从IOS应用访问用户数据

 [GIDSignIn sharedInstance].uiDelegate = self;
 [[GIDSignIn sharedInstance] setScopes:@[ ... ];
 [[GIDSignIn sharedInstance] signInSilently];

然后我在appDelegate中收到accessToken和refreshToken,并将其发送到运行PHP并使用此Google客户端库(https://github.com/googleapis/google-api-php-client)的服务器...在开始的第一个小时中,一切正常,并且访问令牌有效,并允许我访问所有范围。然后一个小时后,访问令牌过期,我尝试使用此代码刷新它

$client = new Google_Client();
$client->setApplicationName(<app name>);
$client->setDeveloperKey(<google_oauth_developer_key>);
$client->setClientSecret(<google_oauth_client_secret>);
$client->setClientId(<google_oauth_client_id>);
$client->refreshToken("1/12ju3ZZim-r6co195lIVNNvzBq9x5G64GJCWkYsOQ18");

和上面的“ refreshToken”函数返回此错误

=> [
     "error" => "unauthorized_client",
     "error_description" => "Unauthorized",
   ]

值得注意的是app namegoogle_oauth_developer_keygoogle_oauth_client_secretgoogle_oauth_client_id并未更改。与访问令牌尚未过期时用于检索用户的联系人,日历事件等的相同。

什么可能导致此错误?

2 个答案:

答案 0 :(得分:0)

您实际上需要在某个时候使用刷新令牌。

if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        $client->getAccessToken();

我的Oauth2Authentication.php样本中提取了代码

注意

还请记住,刷新令牌是基于用户/客户端的。因此,如果令牌是由一个客户端生成的,那么另一个客户端可能将无法使用它。如果您可以在php应用程序中使用在Ios代码中创建的刷新令牌,我将感到非常惊讶。客户端类型不同。

答案 1 :(得分:0)

好的,所以我弄清楚了我做错了什么。我最初遵循这些说明https://developers.google.com/identity/sign-in/ios/sign-in,它们假定您仅需要联机访问,但实际上我需要脱机访问范围,因此我遵循了这些说明https://developers.google.com/identity/sign-in/ios/offline-access,现在可以使用。因此,与其像这样让IOS应用单独发送访问令牌和刷新令牌

elementdf[,-1]

我只是让它像这样发送- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error { if (!error) { NSString *accessToken = user.authentication.accessToken; NSString *refreshToken = user.authentication.refreshToken;

serverAuthCode

然后在服务器上运行此代码以获取访问令牌

- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {

      if (!error) {
        NSString *serverAuthCode = user.serverAuthCode;

,然后当访问令牌过期时,我运行它来刷新它

$access_token = $client->authenticate($google_server_auth_code);
$client->setAccessToken($access_token);