如何通过Javascript Google Drive API登录特定的Google云端硬盘帐户

时间:2017-04-04 03:35:29

标签: google-drive-api google-oauth

我正在尝试通过Javascript Google Drive API运行我的Google云端硬盘脚本。这样可以正常工作,但前提是我在打开的弹出窗口中登录我的帐户。我希望每次都登录同一个帐户,因此想知道是否有任何方法可以自动登录,以便绕过必须输入该登录信息的用户。

2 个答案:

答案 0 :(得分:0)

简而言之,每次Google身份提供商JSON网络令牌过期后,您都会至少登录一次。我不确定Goolge Drive API有多长,但通常这些令牌可能适用于从单个请求到数天的任何地方。

以下是Google API OAuth2的文档 https://developers.google.com/identity/protocols/OAuth2

  
      
  1. 如有必要,请刷新访问令牌。
  2.         

    访问令牌的生命周期有限。如果您的应用需要访问权限   对于超出单一访问令牌生命周期的Google API,它可以   获取刷新令牌。刷新令牌允许您的应用程序   获得新的访问令牌。

         

    注意:在安全的长期存储中保存刷新令牌并继续   只要它们仍然有效,就使用它们。限制适用于数量   刷新每个客户端 - 用户组合和每个发布的令牌   所有客户的用户,这些限制是不同的。如果你的   应用程序请求足够的刷新令牌来覆盖其中一个   限制,旧的刷新令牌停止工作。

Google提供了一个快速入门指南,用于通过Google Apis实施用户签名。 Google使用OAuth2协议,您必须在其中注册Google作为客户端应用程序。注册为客户端应用程序后,您将获得一个客户端ID,您通常会以某种形式的应用程序初始化提供给您的应用程序。

以下是指向快速入门指南的链接,可帮助您入门: https://developers.google.com/drive/v3/web/quickstart/js

请注意,这是一个基本示例,未演示如何处理持久化JSON Web令牌,以便用户无需登录每个请求。我概述了一种在JavaScript和Angular中管理身份验证的简单方法,以使您朝着正确的方向前进,但方向不完整。

例如,在Angular中:

// Configures the required variables before Running an Instance of the App    
angular.module("yourModuleName").config(configureApp);

// Executed when the App Instance launches, allowing you to connect to Google APIs when the App starts    
angular.module("yourModuleName").run(runApp);

其中configureApp和runApp是处理AngularJS Framework中的应用程序初始化的JS函数。以下示例中的代码将从他们自己的App的REST API中检索Apps Google客户端ID。这只是您可以从存储中检索这些凭据的示例,但很可能不是最安全的示例:

var configureApp = function($http,$window) {
   // Setup your CLIENT ID from your own REST API (or any other mechanism you may choose)
   var httpPromise = $http.get("http://myApp.myDomain.com/config/googleClient");
   // Handle the Response from the above GET Request
   httpPromise.then(
      // Handle Success
      function(response) {
          // Store the CLIENT ID in local storage for example
          $window.localStorage.setItem("GOOGLE_API_CLIENT_ID", response.data.clientId);
          // Setup the App Wide variables for Google API
          // Client ID and API key from the Developer Console
          var CLIENT_ID = response.data.clientId;

          // Array of API discovery doc URLs for APIs used by the quickstart
          var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"];

      // Authorization scopes required by the API; multiple scopes can be
      // included, separated by spaces.
      var SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly';

   // Do more initialization configuration
};

var runApp = function() {
   // Initialize the API
   gapi.client.init({
          discoveryDocs: DISCOVERY_DOCS,
          clientId: CLIENT_ID,
          scope: SCOPES
        }).then(function () {
          // Listen for sign-in state changes.
          gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

          // Handle the initial sign-in state.
          updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
          authorizeButton.onclick = handleAuthClick;
          signoutButton.onclick = handleSignoutClick;
        });
}

与Angular一起使用的功能取决于您需要在Angularjs应用中定位的所需应用生命周期。这种方法可以应用于其他JS框架,如React和Backbone。

要突出显示文档中的另一个视角,updateSigninStatus将是捕获Google授权请求返回的JSON Web令牌的好地方,此时您可以将此令牌存储在浏览器中。 s window.localStorage可重复使用。

然后,只要Google API需要身份验证,您就可以重复使用该令牌。令牌通常具有到期时间。在令牌过期之前,您将能够阻止API显示登录模式。

这意味着您仍然需要使用此方法管理授权流程背后的逻辑,监控Google请求令牌刷新或重新身份验证的任何响应。

Auth0是一个出色的身份验证和授权插件,提供多种语言版本,可与Google和许多其他OAuth2身份提供商联系。 Google云端硬盘API使用自己的身份提供商服务与您注册的应用的客户ID一起确认您的应用用户的身份。

以下是我在为需要我使用Google身份提供商实施授权的项目实施授权时找到的链接: https://jwt.io/ https://auth0.com/ Best practices for authentication and authorization in Angular without breaking RESTful principles? https://thinkster.io/tutorials/angularjs-jwt-auth

答案 1 :(得分:0)

您是说所有用户都登录同一个Google帐户?

在这种情况下,您有2个选项。

1 /编写具有存储刷新令牌的服务器应用程序。创建一个端点,允许经过身份验证的用户请求访问令牌。

2 /在JavaScript中嵌入刷新令牌,但要确保只有经过身份验证的用户才能加载JS