服务器到服务器使用Google Apps脚本进行身份验证API可执行文件

时间:2017-10-16 14:47:57

标签: python python-3.x google-apps-script google-api

我正在尝试使用服务器设置一个Google应用脚本API可执行文件,以便为我正在设置的Python微服务进行身份验证。

使用Quickstart,我能够通过Auth2使其工作,但我无法使其与服务帐户一起使用。我将脚本和电子表格的访问权限发送到服务帐户电子邮件。客户端密钥JSON中的项目ID与应用程序脚本的项目ID匹配。我将它作为API可执行文件进行了部署。

这是我下面的代码(虽然我不认为代码是问题):

from oauth2client.service_account import ServiceAccountCredentials
from httplib2 import Http
from googleapiclient.discovery import build


scopes = [
    'https://www.googleapis.com/auth/drive',
    'https://www.googleapis.com/auth/script.external_request',
    'https://www.googleapis.com/auth/script.storage',
    'https://www.googleapis.com/auth/spreadsheets',
    'https://www.googleapis.com/auth/userinfo.email'
]
credentials = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scopes)
http_auth = credentials.authorize(Http())
service = build('script', 'v1', http=http_auth)


request = {'function': 'testApi'}
response = service.scripts().run(body=request, scriptId='SCRIPT_ID').execute()

print(response)

我的App Script中的testApi函数是一个返回“It works”的简单函数。

我一直认为用户在使用个人帐户时没有权限(403),甚至在使用组织时也没有权限(G Suite帐户)。

如前所述,Google文档中的快速入门教程有效,但这不是使用服务帐户。

是否有人将Google Apps Scripts API可执行文件与服务器到服务器身份验证帐户流程一起使用?

1 个答案:

答案 0 :(得分:1)

您可能需要查看有关Using Google Service Accounts with Google Apps Script的本教程。此示例代码显示了如何使用Service Accounts在Google Apps脚本中使用OAuth。

要使此代码生效,您需要使用create a Google Service account domain-wide delegation,将私钥和客户端客户端电子邮件替换为实际值,并将客户端ID添加到您的Google Apps管理控制台中驱动API范围。 OAuth 2.0访问令牌存储在脚本属性中。

var JSON = {
    "private_key": "Your Private Key",
    "client_email": "serviceacount@project-ctrlq.iam.gserviceaccount.com",
    "client_id": "1234567890",
    "user_email": "amit@labnol.org"
};

function getOAuthService(user) {
    return OAuth2.createService("Service Account")
        .setTokenUrl('https://accounts.google.com/o/oauth2/token')
        .setPrivateKey(JSON.private_key)
        .setIssuer(JSON.client_email)
        .setSubject(JSON.user_email)
        .setPropertyStore(PropertiesService.getScriptProperties())
        .setParam('access_type', 'offline')
        .setScope('https://www.googleapis.com/auth/drive');
}

function getUserFiles() {
    var service = getOAuthService();
    service.reset();
    if (service.hasAccess()) {
        var url = 'https://www.googleapis.com/drive/v2/files?pageSize=1';
        var response = UrlFetchApp.fetch(url, {
            headers: {
                Authorization: 'Bearer ' + service.getAccessToken()
            }
        });
        Logger.log(response.getContentText());
    }
}

function reset() {
    var service = getOAuthService();
    service.reset();
}

此外,如果您收到403 Insufficient权限错误,可能是因为该应用程序正在请求访问未在Google Apps管理控制台中授权的API范围。 invalid_grant错误可能是由于托管应用程序的服务器的日期和时间设置不正确所致。