Google OAuth访问令牌不刷新令牌NULL

时间:2017-01-24 20:33:33

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

我正在尝试在我的服务器上获取访问令牌以使用来自PHP客户端库的GMail API,并且在我通过getAccessToken();我已经存储访问令牌的var_drump变量后,我获得的所有内容都是NULL方法

知道我做错了什么,以便我可以如何访问令牌?

我在URL中有一个有效的auth代码和code参数,当我尝试获取访问令牌时,我不知道为什么我得到null。有什么想法吗?

这是我的代码:

require_once 'vendor/autoload.php';
$redirect_uri = 'https://website.com/m/?mail=tokened';
$client = new Google_Client();
$client->setAuthConfig('client_secrets.json');
$client->setRedirectUri($redirect_uri);
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->authenticate($_GET['code']);
$access_token = $client->getAccessToken();
var_dump($access_token);

我的进一步谷歌搜索发现了这一点:Google API - request for token from Oauth2 returns null token

我根据该代码尝试了以下内容,因为这是没有错误运行的内容,而不是答案中的内容,而且我仍然是NULL

这次我尝试在服务器端执行授权代码并从中获取访问令牌,唯一的区别是这次它确实要求访问gmail数据的权限。

require_once 'vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfig('client_secrets.json');
$client->setScopes('https://mail.google.com');
if($_GET['mail']=='approved'){
    $client->setRedirectUri('https://website.com/m/php/googleTokens.php?mail=tokened');
    return header('Location: ' . $client->createAuthUrl());
}
else{
    $client->authenticate($_GET['code']);
    $tokens = $client->getAccessToken();
    var_dump($tokens);
}

1 个答案:

答案 0 :(得分:2)

让我们确保正确遵循身份验证流程。首先,客户端向Google的OAuth系统发送身份验证请求,然后Google会返回一个访问代码,稍后您可以交换访问令牌。这个过程的逻辑应该是这样的:

require_once 'vendor/autoload.php'; //Include PHP Client Library

//Create client object and set its configuration
$client = new Google_Client();
$client->setAuthConfig('client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/index.php');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->addScope(array("email", "profile"));

//Check if the access token is already set and if it is, var dump access token
if(isset($_SESSION["access_token"]) && $_SESSION["access_token"] ) {

    $client->setAccessToken($_SESSION['access_token']);

    var_dump($_SESSION['access_token']);

} else { // if access token is not set, authenticate client

  if( !isset($_GET["code"]) ) { // if there is no access code

    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

  } else { //if there is an access code

    $client->authenticate($_GET['code']); //authenticate client
    $_SESSION['access_token'] = $client->getAccessToken(); //save access token to session
    $redirect_uri = "http://".$_SERVER['HTTP_HOST']."/index.php";
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));

  }
}

在运行逻辑之前,请转到myaccount.google.com/permissions并删除应用程序,然后运行上面的代码。最后,请不要忘记查看official documentation以获取更详细的说明。这里有一些关于stackoverflow的例子,所以我建议你也检查它们。我希望这有帮助!