我正在尝试在我的服务器上获取访问令牌以使用来自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);
}
答案 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的例子,所以我建议你也检查它们。我希望这有帮助!