3

我在获取用于实例化 Drive Service Account 的示例代码时遇到了一些麻烦。我已按照指示在 API 控制台中设置了服务帐户,并包含了“ https://www.googleapis.com/auth/drive ”的范围,但运行此帐户会产生以下错误:“授权失败。服务器消息: (Signet::AuthorizationError)”。

奇怪的是,如果我省略 user_email 地址,它不会产生错误。

我的目标是能够对存储在组织驱动器上的所有文件进行审核,据我了解,使用服务帐户将是获取所有存储文件列表的方法。

我是否为此错过了服务器端的一些特殊设置?

require 'google/api_client'

## Email of the Service Account #
SERVICE_ACCOUNT_EMAIL = '<service account email>@developer.gserviceaccount.com'

## Path to the Service Account's Private Key file #
SERVICE_ACCOUNT_PKCS12_FILE_PATH = '<private key file>-privatekey.p12'

def build_client(user_email)
    key = Google::APIClient::PKCS12.load_key(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'notasecret')
    asserter = Google::APIClient::JWTAsserter.new(SERVICE_ACCOUNT_EMAIL, 'https://www.googleapis.com/auth/drive', key)
    client = Google::APIClient.new

    client.authorization = asserter.authorize(user_email)
    return client
end

client = build_client("<users email address>")
4

3 回答 3

9

在我看来,这就像您使用的是较旧的示例。我想这就是你一年前的做法。早在 2012 年末,这种设置应用程序的方法已被弃用,因为 Signet 已更新为处理 OAuth2 设置的所有方面。

这是我通常用来创建服务帐户的代码。您可以对其进行调整以适应您的方法。

client.authorization = Signet::OAuth2::Client.new(
 :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
 :audience => 'https://accounts.google.com/o/oauth2/token',
 :scope => "https://www.googleapis.com/auth/drive",
 :issuer => "<service account email>@developer.gserviceaccount.com",
 :signing_key => Google::APIClient::KeyUtils.load_from_pkcs12("<private key file>-privatekey.p12", "notasecret"),
 :person => "<users email address>")
client.authorization.fetch_access_token!

如果您仍然有问题,请告诉我,我会看看是否可以提供帮助。

于 2013-08-28T04:18:19.160 回答
3

使用 google-api-client 的 0.9.13 版,我成功地使用了伍德沃德答案的以下轻微改编(注意缺少 person 参数):

def service_account_authorization(credentials_file, scope)
  credentials = JSON.parse(File.open(credentials_file, 'rb').read)
  authorization = Signet::OAuth2::Client.new(
    :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
    :audience => 'https://accounts.google.com/o/oauth2/token',
    :scope => scope,
    :issuer => credentials['client_id'],
    :signing_key => OpenSSL::PKey::RSA.new(credentials['private_key'], nil),
  )
  authorization.fetch_access_token!
  authorization
end

此代码段采用从 Google Cloud Console 为服务帐户下载的文件,并返回可提供给 Google::Apis::*Service.authorization 的 auth 对象。

谢谢詹姆斯!

于 2016-09-22T14:48:28.190 回答
2

我使用 Java 处理过服务帐户+驱动器+文件权限。为了对特定用户使用权限,我必须允许一定的范围。关于您的问题,我唯一能猜到的是您可能错过了代表团部分

于 2013-08-28T09:41:40.063 回答