如何更改 Google 访问令牌的到期时间?
How to change the expiration time of a Google Access Token?
我有这段代码可以在 php 中使用 oauth 2.0 api 对用户进行身份验证,但我想更改令牌的到期时间,通常令牌会在 1 小时后到期,但我必须更改它的最长时间我认为是 200 天。我怎样才能做到这一点。任何帮助或建议将不胜感激
<?php
class Connection {
public function __construct() {
$this->credentials = "credentials.json";
$this->client = $this->create_client();
}
public function get_client() {
return $this->client;
}
public function get_credentials() {
return $this->credentials;
}
public function is_connected() {
return $this->is_connected;
}
public function get_unauthenticated_data() {
$authUrl = $this->client->createAuthUrl();
return "<a href='$authUrl'>Click here to link your account</a>";
}
public function credentials_in_browser() {
if ($_GET['code']) {
return true;
}
return false;
}
public function create_client() {
$client = new Google_Client();
$client->setApplicationName('Gmail API PHP');
$client->addScope('https://mail.google.com/');
$client->setAuthConfig('credentials.json');
$client->setAccessType('offline');
$client->setPrompt('select_account consent');
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
}
if ($client->isAccessTokenExpired()) {
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
} elseif($this->credentials_in_browser()) {
$authCode = $_GET['code'];
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);
if (array_key_exists('error', $accessToken)) {
throw new Exception(join(', ', $accessToken));
}
} else {
$this->is_connected = false;
return $client;
}
if (!file_exists(dirname($tokenPath))) {
mkdir(dirname($tokenPath), 0700, true);
}
file_put_contents($tokenPath, json_encode($client->getAccessToken()));
}
else {}
$this->is_connected = true;
return $client;
}
}
?>
欢迎来到 Oauth2 的世界。
标准访问令牌在一小时后过期。这是由创建它的授权服务器配置的。因此,如果您拥有创建它的授权服务器,您将有权更改到期时间。
Google 访问令牌由 Googles 授权服务器创建,Googles 访问令牌在一小时后过期。您无权更改此项。
话虽这么说。
您的代码似乎在使用离线访问并使用刷新令牌请求新的访问令牌。
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
只要您的应用程序处于生产状态,刷新令牌就会长期有效,您的刷新令牌不应过期。然后,您的代码将在需要时请求新的访问令牌。
所以从技术上讲,您不需要将访问令牌设置为 200 天,您的刷新令牌应该已经比那个时间长了。
请注意 gmail api 如果用户更改密码,刷新令牌将过期。
我有这段代码可以在 php 中使用 oauth 2.0 api 对用户进行身份验证,但我想更改令牌的到期时间,通常令牌会在 1 小时后到期,但我必须更改它的最长时间我认为是 200 天。我怎样才能做到这一点。任何帮助或建议将不胜感激
<?php
class Connection {
public function __construct() {
$this->credentials = "credentials.json";
$this->client = $this->create_client();
}
public function get_client() {
return $this->client;
}
public function get_credentials() {
return $this->credentials;
}
public function is_connected() {
return $this->is_connected;
}
public function get_unauthenticated_data() {
$authUrl = $this->client->createAuthUrl();
return "<a href='$authUrl'>Click here to link your account</a>";
}
public function credentials_in_browser() {
if ($_GET['code']) {
return true;
}
return false;
}
public function create_client() {
$client = new Google_Client();
$client->setApplicationName('Gmail API PHP');
$client->addScope('https://mail.google.com/');
$client->setAuthConfig('credentials.json');
$client->setAccessType('offline');
$client->setPrompt('select_account consent');
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
}
if ($client->isAccessTokenExpired()) {
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
} elseif($this->credentials_in_browser()) {
$authCode = $_GET['code'];
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);
if (array_key_exists('error', $accessToken)) {
throw new Exception(join(', ', $accessToken));
}
} else {
$this->is_connected = false;
return $client;
}
if (!file_exists(dirname($tokenPath))) {
mkdir(dirname($tokenPath), 0700, true);
}
file_put_contents($tokenPath, json_encode($client->getAccessToken()));
}
else {}
$this->is_connected = true;
return $client;
}
}
?>
欢迎来到 Oauth2 的世界。
标准访问令牌在一小时后过期。这是由创建它的授权服务器配置的。因此,如果您拥有创建它的授权服务器,您将有权更改到期时间。
Google 访问令牌由 Googles 授权服务器创建,Googles 访问令牌在一小时后过期。您无权更改此项。
话虽这么说。
您的代码似乎在使用离线访问并使用刷新令牌请求新的访问令牌。
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
只要您的应用程序处于生产状态,刷新令牌就会长期有效,您的刷新令牌不应过期。然后,您的代码将在需要时请求新的访问令牌。
所以从技术上讲,您不需要将访问令牌设置为 200 天,您的刷新令牌应该已经比那个时间长了。
请注意 gmail api 如果用户更改密码,刷新令牌将过期。