Google API:如何增加访问令牌到期日期?

问题描述 投票:0回答:2

Google API 到期日期是 1 小时,问题是我使用 API 是为了允许用户使用管理 SDK 功能(列出组、向组添加成员等)

没有人可以在一小时内完成任何一项,这将需要用户每天多次登录他们的帐户来管理他们的群组。如果您只想使用 Google 对用户进行身份验证,则 1 小时的到期日期比较合适。

如何增加它或有什么解决方法?我错过了什么吗?

google-api google-api-php-client google-admin-sdk google-workspace google-php-sdk
2个回答
7
投票

出于安全原因,您无法更改访问令牌的有效期。但是,如果您请求离线访问与令牌关联的范围,您可以刷新访问令牌而不提示用户许可。

  • 如果您使用 Google API 客户端库,客户端对象 会根据需要刷新访问令牌,只要您将该对象配置为离线访问即可。
  • 如果您没有使用客户端库,则需要在
    将用户重定向到 Google 的 OAuth 2.0 服务器
    时将
    access_type
    HTTP 查询参数设置为offline。在这种情况下,当您交换授权代码 访问令牌时,Google 的授权服务器会返回一个刷新令牌。然后,如果访问令牌过期(或在任何其他时间),您可以使用刷新令牌来获取新的访问令牌。

0
投票

您不能增加

access_code
的到期时间。

但是,如果当前访问令牌过期,您可以生成新的访问令牌!

  1. 首先得到
    authentication code
    .
  2. 从谷歌获取
    refresh_token
    使用验证码。
  3. 使用
    access_token
    获得
    refresh_token
    when 它过期了。

我假设你有验证码。如果您没有代码,那么这里有一篇文章,介绍如何将 oauth 集成到您的 React 应用程序并从谷歌获取身份验证代码。您可以查看此以了解更多详细信息。

生成刷新和访问令牌:

替换有效载荷内的基本值(

code
client_id
client_secret
)。

let payload = {
  grant_type: 'authorization_code',
  code: '****SFJSDFJKAN-DF',
  client_id: '******.googleusercontent.com',
  client_secret: 'GOCS*******m5Qzg',
  redirect_uri: 'http://localhost:3000',
};

axios
  .post(`https://oauth2.googleapis.com/token`, payload, {
    headers: {
      'Content-Type': 'application/json;',
    },
  })
  .then((res: any) => {
    return res.data;
  })
  .then((response: any) => {
    console.log('refresh token: ', response);
  })
  .catch((err) => console.log('err: ', err));

你会得到这样的回复:

{
    access_token: "********KAjJZmv4xLvbAIHey",
    expires_in: 3599,
    id_token: "***************VeM7cfmgbvVIg",
    refresh_token: "***************VeM7cfmgbvVIg",
    scope: "https://www.googleapis.com/auth/gmail.readonly openid 
            .....
            .....
            https://mail.google.com/",
    token_type: "Bearer",
}

保存您的刷新和访问令牌。 现在您可以使用刷新令牌生成新的访问令牌!

从刷新令牌生成新的访问令牌。

let payloadForAccessToken = {
  grant_type: 'refresh_token',
  refresh_token: '*******SFKNSK***',
  client_id: '******.googleusercontent.com',
  client_secret: '*****cxCsrf***8UUm5Qzg',
};

axios
  .post(`https://oauth2.googleapis.com/token`, payloadForAccessToken, {
    headers: {
      'Content-Type': 'application/json;',
    },
  })
  .then((res: any) => {
    return res.data;
  })
  .then((res) => {
    console.log('new token response: ', res);
  })
  .catch((err) => console.log('err: ', err));
© www.soinside.com 2019 - 2024. All rights reserved.