我在网络服务器上使用oauth2,流程完美无缺(https://developers.google.com/accounts/docs/OAuth2WebServer).
但是,我有一些情况需要重新获取refresh_token(比方说,例如,refresh_token已经"丢失").
在这种情况下,当我再次进入第1阶段和第2阶段时,我只获得access_token而不是refresh_token.如果用户通过他的Google帐户控制台撤消权限并再次进入第1阶段和第2阶段,我将获得一个新的refresh_token.
这是已知的oauth2行为吗?有没有办法强制一个新的refresh_token或再次获得相同的刷新?
是否可以不通过服务帐户从Google Analytics Data API(GA4 帐户)提取数据?我可以使用服务帐户正常提取(下面的示例),但我需要通过 oauth(同意屏幕)进行授权,并且我发现绝对没有任何相关内容。
<?php
require 'vendor/autoload.php';
use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\Metric;
$client = new BetaAnalyticsDataClient(['credentials' => 'MY-CREDENTIALS.json']);
$response = $client->runReport([
'property' => 'properties/MY-ID',
'dateRanges' => [
new DateRange([
'start_date' => '2020-03-31',
'end_date' => 'today',
]),
],
'dimensions' => [new Dimension(
[
'name' => 'city',
]
),
],
'metrics' => [new Metric(
[
'name' => 'activeUsers',
]
)
]
]);
print 'Report result: ' . PHP_EOL;
foreach ($response->getRows() as $row) {
print $row->getDimensionValues()[0]->getValue()
. …Run Code Online (Sandbox Code Playgroud) 我用字符串进行代码请求:
https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly&
state={%22externalUserId%22:%22TEST%22}&
access_type=offline&
include_granted_scopes=true&
redirect_uri=http://localhost:3344/oauth2/google/callbackcode&response_type=code&
client_id=676016849609-r53vpjccpr9kf5uvuul7h6kvek1id2oh.apps.googleusercontent.com
Run Code Online (Sandbox Code Playgroud)
我收到 oauth2 代码。我使用java客户端做令牌请求代码。
private AuthorizationCodeFlow flow;
@PostConstruct
public void init() {
NetHttpTransport transport = null;
try {
transport = GoogleNetHttpTransport.newTrustedTransport();
} catch (GeneralSecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
flow = new GoogleAuthorizationCodeFlow.Builder(
transport, JSON_FACTORY, GoogleClientSecrets.load(JSON_FACTORY,
new InputStreamReader(GoogleCalendarClient.class.getResourceAsStream("/client_secret_676016849609-r53vpjccpr9kf5uvuul7h6kvek1id2oh.apps.googleusercontent.com.json")))
, SCOPES).build();
} catch (IOException e) {
e.printStackTrace();
}
callBackPattern = String.format(callBackPattern, provider().lowerCaseName());
}
Run Code Online (Sandbox Code Playgroud)
flow.newTokenRequest(oauthCode)
.setRedirectUri(callBackPattern)
.execute();
Run Code Online (Sandbox Code Playgroud)
结果我收到TokenResponse
{
"access_token": "ya29.Glv_A8Fidn8cRmQveIy0pbDIjcxssKN61X20u4zjlDYV1NbiC-QO593_isRa8Q5ngSFr-y-zICjXw1WZy4OguOh90SCyPnz0NGYpw7I4fahzH7NORQm-bbnA9Chr",
"expires_in": 3592,
"id_token": "eyJhbGciOOiZUzI1NiIsImtpZCI6IjgxMDkxNGZiOTk0OGYxZTQzNTdjYzg3MjY4MDg3Mjk4ZTgzNTlkMjAifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiaWF0IjoxNDg4MTg0NDcxLCJleHAiOjE0ODgxODgwNzEsImF0X2hhc2giOiJaVjgxejQwV0pYX3N1WkplazZnem93IiwiYXVkIjoiNjc2MDE2ODQ5NjA5LXI1M3ZwamNjcHI5a2Y1dXZ1dWw3aDZrdmVrMWlkMm9oLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE4MTk1OTk4MjU4MDIyMzM2MDUwIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImF6cCI6IjY3NjAxNjg0OTYwOS1yNTN2cGpjY3ByOWtmNXV2dXVsN2g2a3ZlazFpZDJvaC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImVtYWlsIjoic2VyZ2lpX3ZsYXNpdWtAdWtyLm5ldCJ9.DWkcTAwOPnirsDL_ok10GHjoe0Rg0n-uYYtSfn3tXkIg-xB6taaYi2-gdNCh64-hSzgQWsdeLu7Mga1rXfGVTw-iBPWhU80MhoiH_YZtLpAK7f94rBajqHa8ucei1P7RSZxRD-RdB1YMjpJPQhKx5DV0W9xBPB3LN8s1C3vL-06Y4nu7yB2ZFllG6SIJbl7f0Kn2S_SCAxhxGvwSuIqW4ogXwqc0njdBwWlOvdxn8hQ33dftljn-Q5fJ0iEroLEhUhnGwmGAcr7yl-HRjZQvz6ICyQLvRGDv6J12pEdDu2S0mGZfV_zNLG2-EKqo6xm99WsFSMsV_6_TeCG478f7bQ",
"token_type": "Bearer" …Run Code Online (Sandbox Code Playgroud)