Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;未经授权的“客户”;使用PHP客户端与Google API客户端刷新令牌时出错?_Php_Ios_Google Api_Google Oauth_Google Api Php Client - Fatal编程技术网

&引用;未经授权的“客户”;使用PHP客户端与Google API客户端刷新令牌时出错?

&引用;未经授权的“客户”;使用PHP客户端与Google API客户端刷新令牌时出错?,php,ios,google-api,google-oauth,google-api-php-client,Php,Ios,Google Api,Google Oauth,Google Api Php Client,我正在使用GoogleSignIn pod中的此代码从IOS应用程序请求访问用户数据 [GIDSignIn sharedInstance].uiDelegate = self; [[GIDSignIn sharedInstance] setScopes:@[ ... ]; [[GIDSignIn sharedInstance] signInSilently]; 然后,我在appDelegate中接收accessToken和refreshToken,并将其发送到运行PHP并使用此googl

我正在使用GoogleSignIn pod中的此代码从IOS应用程序请求访问用户数据

 [GIDSignIn sharedInstance].uiDelegate = self;
 [[GIDSignIn sharedInstance] setScopes:@[ ... ];
 [[GIDSignIn sharedInstance] signInSilently];
然后,我在appDelegate中接收accessToken和refreshToken,并将其发送到运行PHP并使用此google客户端库()的服务器。。。在第一个小时,一切正常,访问令牌有效,允许我访问所有范围。一小时后,访问令牌过期,我尝试使用此代码刷新它

$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");
值得注意的是,
app name
google\u oauth\u developer\u key
google\u oauth\u client\u secret
google\u oauth\u client\u id
没有改变。它们与之前在访问令牌尚未过期时检索用户的联系人、日历事件等的操作相同


什么可能导致此错误?

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

if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        $client->getAccessToken();
代码从我的样本中删除

注意


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

好吧,我知道我做错了什么。我最初遵循这些说明,假设您只需要在线访问,但实际上我需要离线访问作用域,所以我遵循这些说明,它现在可以工作了。因此,不要让IOS应用程序像这样分别发送访问令牌和刷新令牌

- (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);
然后,当访问令牌过期时,我运行这个来刷新它

$access_token = $client->refreshToken($client->getRefreshToken());
$client->setAccessToken($access_token);

谢谢你的回答。我认为单独的客户端可以工作,因为它允许我访问所有的作用域,并且在访问令牌过期之前一切都可以正常工作。。。应用程序仍然是一样的,只是不同的客户端id使用不带客户端id的访问令牌和使用不同的客户端id刷新访问令牌是两件不同的事情。尝试一下代码,看看会发生什么。我尝试了一下代码,结果失败了,出现了错误
PHP注意:未定义索引:expires\u位于/app/vendor/google/apiclient/src/google/Client.PHP的第484行
。。。当我调用
$client->isAccessTokenExpired()
。。。你能告诉我访问令牌是什么样子的吗?我的代码看起来像这样->
ya29.GluSBn-ektRuma45i1ILoKXGYWkSDv5XgAY84px2OZ0-5X2Efjsja2Ij4ne-Zun75w5rw3NVok9-Sj9G3sdW1n4jD7mH9(4h4CT)Rm5xqtNuDjeWB0jSqUZss-Pf
,但我认为它需要是一个json对象才能成功调用这些其他函数(比如
isAccessTokenExpired
函数)可能是因为它无法根据不同的客户端id验证来自IOS的访问令牌。但它可以使用它。我建议你选择一种技术。不过出于好奇,你确实在谷歌开发者控制台的同一个项目下创建了两个客户端,对吗?谢谢你的帮助!我想出来了
$access_token = $client->refreshToken($client->getRefreshToken());
$client->setAccessToken($access_token);