4

私は Web 開発者で、ビジネス ソフトウェアから Google API にアクセスしたいと考えています。ドライブ アカウントを作成し、コード (VB.NET) を介してフォルダーとファイルを作成したいと考えています。ドキュメントに従い、JWT (Json Web Token) を作成し、サービス アカウントを使用して、アクセス トークンを取得しました。

次に、Google API にアクセスしたいと思います。コンソール アプリケーションを使用して、いくつかのフォルダーを作成しました。コードを介して、作成されたフォルダーの一覧を取得できます。しかし、Google ドライブ アカウントにそれらのフォルダが表示されません。それはどのように可能ですか?

フォルダとファイルのリストを表示するためにサーバーに送信するリクエストは次のとおりです: https://www.googleapis.com/files/ {FILE_ID}?key={API_KEY}

FILE_ID 要素に関連する情報を含む JSON 文字列を応答として取得します。例えば:

{ "kind":"drive#file", "id":"FILE_ID", "mimeType":"application/vnd.google-apps.folder"(フォルダの場合) / "FILE_MIMETYPE"(ファイルの場合) , "タイトル":"フォルダ名" / "ファイル名", ... }

Google API へのアクセスに使用したコードは次のとおりです: (VB.NET)

...

Public Function browseFile(ByVal fId As String) As List (Of FileSourceElement)

  Dim webclient As New WebClient()
  webclient.Headers.Add("Authorization", " Bearer " & _accessToken)
  webclient.Headers.Add("X-JavaScript-User-Agent", "Google APIs Explorer")
  Dim res As String = webclient.DownloadString("https://www.googleapis.com/drive/v2/files?key=" & _apiKey).Trim()

  'res contains the JSON with the informations of the file/folder 
  ...

End Function

Public Sub createContainer(ByVal path As String)
  Dim webclient As New WebClient()
  webclient.Headers.Add("Authorization", " Bearer " & _accessToken)
  webclient.Headers.Add("X-JavaScript-User-Agent", "Google APIs Explorer")
  webclient.Headers.Add("Content-Type", "application/json")
  webclient.UploadString("https://www.googleapis.com/drive/v2/files", _ 
                     "POST", _ 
                     "{""title"":""daEliminare2"", ""parents"":[{""id"":""" & path & """}], ""mimeType"":""application/vnd.google-apps.folder""}")
End Sub

...

私のGoogleドライブでは、フォルダーを手動で作成したり、ファイルを手動でアップロードしたりしていません。コードを介してのみすべての操作を行う必要があります。

あなたに言ったように、フォルダーを正常に作成し、ファイルのリストを (コードを介して) 正常に印刷しましたが、私の GDrive には、UI によって作成された要素が表示されません。なんで?


サービス アカウントで読みましたが、アクセス トークンを取得するには、ヘッダー、クレーム セット、および署名 (base64 文字列) で構成される Json Web トークン (JWT) と呼ばれる特別な JSON 文字列が必要です。文字列は次のとおりです。

{base64 形式の JWT ヘッダー}.{base64 形式の JWT claimSet}.{base64 形式の JWT 署名}

私のJWTは:

ヘッダ

{
  "alg": "RS256",
  "typ": "JWT"
}

Claim set { "iss": "0123456789@developer.gserviceaccount.com", // ここで、'0123456789' は CLIENT_ID です。"scope": "https://www.googleapis.com/auth/drive", "aud": "https://accounts.google.com/o/oauth2/token", "exp": timeStamp + 3600, //ここで、'timeStamp' は 1970-01-01T00:00:00 からの秒数です。"iat": タイムスタンプ}

署名を書くには、このページで説明されている手順に従いました。

https://developers.google.com/accounts/docs/OAuth2ServiceAccount#computingsignature

JWT を作成したら、それをサーバーに送信し、このモードで応答として JSON 文字列を取得します。

{
  "access_token": "ACCESS_TOKEN", // (e.g.: 1/8xbJqaOZXS...)
  "type_token": "Bearer",
  "expire_in": 3600
}

アクセス トークン (AT) を取得したら、それを使用して Google API にアクセスします。たとえば、ファイルとフォルダーのすべてのリストを表示する場合、次のようなヘッダーを持つ要求を送信します。

Authorization: Bearer AT X-JavaScript-User-Agent: Google APIs Explorer

URL: https://www.googleapis.com/drive/v2/files?key= {MY_API_KEY}

ただし、リストには (VB.NET コンソール アプリケーションを使用して) いくつかの項目があることを強調しておきますが、Google ドライブには何もありません。

Access Token は取得できたのですが、Google API にアクセスできません。

PS: ブラウザを使用せずに Google API にアクセスする必要があります。

パート2:

アクセス トークンを取得するには、ヘッダー、クレーム セット、および署名 (base64 文字列) で構成される Json Web トークン (JWT) と呼ばれる特別な JSON 文字列が必要であるとサービス アカウントで読みました。文字列は次のとおりです。

{base64 形式の JWT ヘッダー}.{base64 形式の JWT claimSet}.{base64 形式の JWT 署名}

私のJWTは:

ヘッダ

{
  "alg": "RS256",
  "typ": "JWT"
}

Claim set { "iss": "0123456789@developer.gserviceaccount.com", // ここで、'0123456789' は CLIENT_ID です。"scope": "https://www.googleapis.com/auth/drive", "aud": "https://accounts.google.com/o/oauth2/token", "exp": timeStamp + 3600, //ここで、'timeStamp' は 1970-01-01T00:00:00 からの秒数です。"iat": タイムスタンプ}

署名を書くには、このページで説明されている手順に従いました。

https://developers.google.com/accounts/docs/OAuth2ServiceAccount#computingsignature

JWT を作成したら、それをサーバーに送信し、このモードで応答として JSON 文字列を取得します。

{
  "access_token": "ACCESS_TOKEN", // (e.g.: 1/8xbJqaOZXS...)
  "type_token": "Bearer",
  "expire_in": 3600
}

アクセス トークン (AT) を取得したら、それを使用して Google API にアクセスします。たとえば、ファイルとフォルダーのすべてのリストを表示する場合、次のようなヘッダーを持つ要求を送信します。

Authorization: Bearer AT X-JavaScript-User-Agent: Google APIs Explorer

URL: https://www.googleapis.com/drive/v2/files?key= {MY_API_KEY}

ただし、リストには (VB.NET コンソール アプリケーションを使用して) いくつかの項目があることを強調しておきますが、Google ドライブには何もありません。

Access Token は取得できたのですが、Google API にアクセスできません。

PS: ブラウザを使用せずに Google API にアクセスする必要があります。

これからもよろしくお願いします

MP

4

4 に答える 4

6

サービス アカウントを使用しているため、すべてのフォルダとファイルはこのサービス アカウントのドライブに作成され、ウェブ UI からはアクセスできず、デフォルトのクォータに制限されます。

ユーザーのドライブにコンテンツを追加するには、通常の OAuth 2.0 フローを実行して、このユーザーから認証情報を取得する必要があります。OAuth 2.0 の詳細については、次のページを参照してください。

于 2012-08-31T15:44:48.003 に答える
0

与えられた解決策を知りませんでした。ファイルを追加した後、ファイルのアクセス許可を追加することで、別の方法で行いました(NodeJSコード。insertFileは、ユーザーによる従来のfileUploadの後に呼び出されます):

insertPermission = function(fileId, value, type, role,authClient,cb) {
  var body = {
    'value': value,
    'type': type,
    'role': role
  };
  var request = drive.permissions.insert({
    'fileId': fileId,
    'resource': body,
    'auth': authClient
  }, function (err,response) {
    cb(err,response);
  });
}

exports.insertFile = function(file,customer,callback) {
    exports.authorize(function (err,authClient) {
        drive.files.insert({
          resource: {
            title: file.name,
            mimeType: file.mimeType,
            parents: [{id:customer.googleDriveFolder}]
          },
          media: {
            mimeType: file.mimeType,
            body: file.buffer
          },
          auth: authClient
        }, function(err, response) {
          debug('error:', err, 'inserted:', response.id);
          if (!err) {
            insertPermission(response.id,customer.email,"user","writer",authClient,function (err,resp){
              callback(null, resp);            
            });
          }
        });
    });
};

サービスアカウントを使用して、秘密鍵の種類の認証でJWTを使用していることに注意してください。

exports.authorize = function(callback) {
    if (_tokens && ((_tokens.expiry_date - (new Date()).getTime())>100 )) callback(null, _authClient);
    else {

    var scope = ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.appdata', 'https://www.googleapis.com/auth/drive.apps.readonly',
'https://www.googleapis.com/auth/drive.file','https://www.googleapis.com/auth/drive.metadata',
'https://www.googleapis.com/auth/drive.metadata.readonly',
'https://www.googleapis.com/auth/drive.readonly',
'https://www.googleapis.com/auth/drive.scripts'];

    var authClient = new google.auth.JWT(
            '<myServiceAccountClientId - xxx@developer.gserviceaccount.com>',
            '<path to key>.pem',
            ''); //seems we could use an user to impersonate requests, i need to test that..
    authClient.authorize(function(err, tokens) {
        if (err) {
            callback(err);
            return;
        }
        callback(null,authClient);    
    });
    }
};
于 2015-06-16T17:08:01.150 に答える