我在获取用于实例化Drive Service帐户的示例代码时遇到了一些麻烦。我已按照指示在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>")
答案 0 :(得分: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!
如果您仍然遇到问题,请告诉我,我会看看是否可以提供帮助。
答案 1 :(得分:2)
我使用Java使用服务帐户+ Drive +文件权限。为了使用特定用户的权限,我必须允许某些范围。我唯一可以猜到的问题是你可能错过了the Delegation part
答案 2 :(得分:2)
使用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的身份验证对象。
谢谢詹姆斯!