3

ドライブ サービス アカウントをインスタンス化するためのサンプル コードを取得するのに問題があります。指示どおりに 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

3

google-api-client のバージョン 0.9.13 を使用して、Woodward の回答を次のようにわずかに適応させることに成功しました (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 にフィードできる認証オブジェクトを返します。

ありがとうジェームズ!

于 2016-09-22T14:48:28.190 に答える
2

Java を使用して、サービス アカウント + ドライブ + ファイルのアクセス許可を操作しました。特定のユーザーのアクセス許可を使用するには、特定のスコープを許可する必要がありました。あなたの問題について私が推測できる唯一のことは、委任の部分を見逃した可能性があるということです

于 2013-08-28T09:41:40.063 に答える