我正在尝试通过Javascript Google Drive API运行我的Google云端硬盘脚本。这样可以正常工作,但前提是我在打开的弹出窗口中登录我的帐户。我希望每次都登录同一个帐户,因此想知道是否有任何方法可以自动登录,以便绕过必须输入该登录信息的用户。
答案 0 :(得分:0)
简而言之,每次Google身份提供商JSON网络令牌过期后,您都会至少登录一次。我不确定Goolge Drive API有多长,但通常这些令牌可能适用于从单个请求到数天的任何地方。
以下是Google API OAuth2的文档 https://developers.google.com/identity/protocols/OAuth2
- 如有必要,请刷新访问令牌。
醇>访问令牌的生命周期有限。如果您的应用需要访问权限 对于超出单一访问令牌生命周期的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