【问题标题】:How to generate access token using refresh token through google drive API?如何通过谷歌驱动 API 使用刷新令牌生成访问令牌?
【发布时间】:2012-05-24 18:05:22
【问题描述】:

我已完成授权步骤并获得访问令牌和刷新令牌。

接下来我应该怎么做才能使用我通过 google drive API 存储的刷新令牌生成访问令牌?

由于我在 Force.com 上工作,因此我将无法使用任何 sdk,因此请建议直接通过 API 实现它的方法。

【问题讨论】:

    标签: authorization google-drive-api


    【解决方案1】:

    如果您想自己实现,Web 服务器应用程序的 OAuth 2.0 流程记录在 https://developers.google.com/accounts/docs/OAuth2WebServer,特别是您应该查看有关使用刷新令牌的部分:

    https://developers.google.com/accounts/docs/OAuth2WebServer#refresh

    【讨论】:

    • 您提到的文档仅处理 Raw-HTTP 通信。 PHP-API中有没有刷新令牌的方法?
    • @ClaudioCherubino ..我很抱歉打断你..但是你能告诉我吗。是否可以获得google drive的授权url,可以像在iOS中使用浏览器pr播放器播放音频和视频一样公开使用
    • 我不想自己实现它。有人可以提供使用 google apis 的示例代码吗?
    【解决方案2】:

    这是一个老问题,但在我看来还没有完全回答,我也需要这些信息,所以我会发布我的答案。

    如果您想使用 Google Api 客户端库,那么您只需要一个包含刷新令牌的访问令牌,然后 - 即使访问令牌将在一小时后过期 - 库也会刷新自动为你代币。

    为了获得带有刷新令牌的访问令牌,您只需要询问离线访问类型(例如在 PHP 中:$client->setAccessType("offline");),您就会得到它。请记住,只有在第一次授权时才能获得带有刷新令牌的访问令牌,因此请务必在第一时间保存该访问令牌,以便随时使用。

    希望对任何人都有帮助:-)

    【讨论】:

    • 您如何真正获得访问令牌?
    • 谷歌云平台
    • 但是这个访问令牌不会在 3600 之后过期?所以我不需要重新验证我的用户?
    • 高亮文本:the access token with the refresh token only in the first authorization
    • 谢谢@While1,我听从了你的建议:-)
    【解决方案3】:

    如果您使用的是 web api,那么您应该使用以下请求正文对 URL 进行 http POST 调用:https://www.googleapis.com/oauth2/v4/token

    client_id: <YOUR_CLIENT_ID>
    client_secret: <YOUR_CLIENT_SECRET>
    refresh_token: <REFRESH_TOKEN_FOR_THE_USER>
    grant_type: refresh_token
    

    刷新令牌永不过期,因此您可以多次使用它。响应将是这样的 JSON:

    {
      "access_token": "your refreshed access token",
      "expires_in": 3599,
      "scope": "Set of scope which you have given",
      "token_type": "Bearer"
    }
    

    【讨论】:

    • 务实地使用 httpclient,在可能的情况下也不使用邮递员。
    • 这似乎是正确的方向,但它也不适合我。如果有人可以提供帮助,我在这里问了一个详细的问题:stackoverflow.com/questions/48775759/…
    • 从哪里获得 client_secret 和刷新令牌?
    • 这对我不起作用。它说未经授权和无效的客户
    • client_secrets 和 client_id 可以从 Google Developers 控制台的项目凭据选项卡中获取。打开console.developers.google.com/apis/dashboard
    【解决方案4】:

    POST /oauth2/v4/token

    主机:www.googleapis.com

    标题

    内容长度:163

    内容类型:application/x-www-form-urlencoded

    请求正文

    client_secret=************&grant_type=refresh_token&refresh_token=sasasdsa1312dsfsdf&client_id=************

    【讨论】:

      【解决方案5】:

      只是发布我的答案以防万一我花了一个小时弄清楚它对任何人有帮助:)

      首先,两个非常有用的链接与 google api 和从任何 google 服务获取数据相关:

      https://developers.google.com/analytics/devguides/config/mgmt/v3/quickstart/web-php

      https://developers.google.com/identity/protocols/OAuth2WebServer

      另外,当使用以下方法时:

      $client-&gt;setAccessToken($token)

      $token 需要是 google 在发出授权请求时返回的完整对象,而不是您在对象内部获得的唯一 access_token,因此如果您获得该对象,可以说:

      {"access_token":"xyz","token_type":"Bearer","expires_in":3600,"refresh_token":"mno","created":1532363626}

      那么你需要给:

      $client-&gt;setAccessToken('{"access_token":"xyz","token_type":"Bearer","expires_in":3600,"refresh_token":"mno","created":1532363626}')

      没有

      $client-&gt;setAccessToken('xyz')

      然后即使您的access_token 已过期,谷歌也会使用access_token 对象中的refresh_token 自行刷新。

      【讨论】:

      • 完美的解释。应该是公认的答案。
      【解决方案6】:

      如果您使用 Java,请按照以下代码 sn-p :

      GoogleCredential refreshTokenCredential = new GoogleCredential.Builder()
          .setJsonFactory(JSON_FACTORY)
          .setTransport(HTTP_TRANSPORT)
          .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
          .build()
          .setRefreshToken(yourOldToken);
      refreshTokenCredential.refreshToken(); //do not forget to call this
      String newAccessToken = refreshTokenCredential.getAccessToken();
      

      【讨论】:

        【解决方案7】:

        使用 ASP.Net Post 调用,这对我有用。

        StringBuilder getNewToken = new StringBuilder();
        getNewToken.Append("https://www.googleapis.com/oauth2/v4/token");                        
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(getNewToken.ToString());
                            var values = new Dictionary<string, string>
                            {
                                { "client_id", <Your Client Id> },
                                { "client_secret", <Your Client Secret> },
                                { "refresh_token", <Your Saved Refresh Token> },
                                { "grant_type", "refresh_token"}
                            };
        
                            var content = new FormUrlEncodedContent(values);
                            var response = await client.PostAsync(getNewToken.ToString(), content);
        

        【讨论】:

          【解决方案8】:

          您需要做的只是一个如下的发布请求:-

          POST https://www.googleapis.com/oauth2/v4/token
          Content-Type: application/json
          
          {
            "client_id": <client_id>,
            "client_secret": <client_secret>,
            "refresh_token": <refresh_token>,
            "grant_type": "refresh_token"
          }
          

          【讨论】:

            【解决方案9】:

            使用邮政电话,为我工作。

            RestClient restClient = new RestClient();
            RestRequest request = new RestRequest();
            
            request.AddQueryParameter("client_id", "value");
            request.AddQueryParameter("client_secret", "value");
            request.AddQueryParameter("grant_type", "refresh_token");
            request.AddQueryParameter("refresh_token", "value");
            
            restClient.BaseUrl = new System.Uri("https://oauth2.googleapis.com/token");
            restClient.Post(request);
            

            https://youtu.be/aHs3edo0-mU

            【讨论】:

            • 谢谢。使用异步调用来调用刷​​新令牌是没有意义的。恕我直言,这是一种更清洁的方法。有一件事,您引用了“RestClient”——您是从通过 nuget 获得的 RestSharp 获得的?
            • @MarkJoel60,是的,我正在使用通过 NuGet 安装的 RestSharp。
            猜你喜欢
            • 2013-07-20
            • 1970-01-01
            • 2014-01-11
            • 2019-05-31
            • 1970-01-01
            • 2021-01-29
            • 2019-03-08
            • 1970-01-01
            • 2020-04-14
            相关资源
            最近更新 更多