88

バックグラウンド サービスでドライブ ファイルにアクセスする必要があるウェブ アプリ (「mydriveapp」) があるとします。アクセスしているファイルを所有するか、所有者がドキュメントを共有している Google アカウントで実行されます。

アプリにリフレッシュ トークンが必要であることは理解していますが、それを取得するためのコードは 1 回しか実行しないため、書きたくありません

注意。これはサービス アカウントを使用していません。アプリは、従来の Google アカウントで実行されます。サービス アカウントは、状況によっては有効なアプローチです。ただし、Oauth Playground を使用してアプリをシミュレートする手法は、冗長な作業を大幅に節約でき、サービス アカウントへの共有がサポートされていないすべての API に適用できます。

4

2 に答える 2

174

これは、 https: //developers.google.com/oauthplayground の Oauth2 Playground で実行できます。

手順:-

  1. Google アカウントを作成します (例: my.drive.app@gmail.com) - または、既存のアカウントを使用している場合は、この手順をスキップしてください。
  2. API コンソールを使用して mydriveapp を登録します ( https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveappまたは単にhttps://console.developers.google.com/apis/ ) 。
  3. 資格情報の新しいセットを作成します。Credentials/Create Credentials/OAuth Client Id次に選択しますWeb application
  4. 有効なリダイレクト URI としてhttps://developers.google.com/oauthplaygroundを含める
  5. クライアント ID (Web アプリ) とクライアント シークレットをメモします。
  6. my.drive.app@gmail.com としてログイン
  7. Oauth2 プレイグラウンドに移動
  8. 設定(歯車アイコン)で、
    • OAuth フロー: サーバー側
    • アクセスの種類: オフライン
    • 独自の OAuth クレデンシャルを使用: TICK
    • クライアント ID とクライアント シークレット: ステップ 5 から
  9. [ステップ 1] をクリックし、Drive API v3 https://www.googleapis.com/auth/driveを選択します(この手法は、リストされている Google API のいずれでも機能します)。
  10. [API の承認] をクリックします。Google アカウントを選択してアクセスを確認するよう求められます
  11. ステップ 2 をクリックし、「トークンの Exchange 認証コード」をクリックします。
  12. 返された更新トークンをコピーして、アプリ、ソース コード、またはアプリがトークンを取得できる何らかの形式のストレージに貼り付けます。

アプリは無人で実行できるようになり、 https: //developers.google.com/accounts/docs/OAuth2WebServer#offline で説明されているようにリフレッシュ トークンを使用してアクセス トークンを取得できます。

注意。リフレッシュ トークンは Google によって期限切れになる可能性があることに注意してください。つまり、新しいリフレッシュ トークンを取得するには、手順 5 以降を繰り返す必要があります。この症状は、リフレッシュ トークンを使用しようとすると無効な許可が返されることです。

NB2。この手法は、一度しか実行されない認証コードを書く手間をかけずに、自分の (そして自分だけの) ドライブ アカウントにアクセスする Web アプリが必要な場合にうまく機能します。ステップ 1 をスキップして、ステップ 6 で「my.drive.app」を自分のメール アドレスに置き換えてください。リフレッシュ トークンが盗まれた場合のセキュリティへの影響を認識していることを確認してください。

以下の Woody のコメントを参照してください。彼はこの Google ビデオにリンクしていますhttps://www.youtube.com/watch?v=hfWe1gPCnzc

. . .

以下は、OAuth プレイグラウンドから更新トークンを使用してドライブ ファイルを一覧表示する方法を示す簡単な JavaScript ルーチンです。Chrome 開発コンソールにコピーして貼り付けるか、ノードで実行するだけです。もちろん、独自の資格情報を提供してください (以下のものはすべて偽物です)。

function get_access_token_using_saved_refresh_token() {
    // from the oauth playground
    const refresh_token = "1/0PvMAoF9GaJFqbNsLZQg-f9NXEljQclmRP4Gwfdo_0";
    // from the API console
    const client_id = "559798723558-amtjh114mvtpiqis80lkl3kdo4gfm5k.apps.googleusercontent.com";
    // from the API console
    const client_secret = "WnGC6KJ91H40mg6H9r1eF9L";
    // from https://developers.google.com/identity/protocols/OAuth2WebServer#offline
    const refresh_url = "https://www.googleapis.com/oauth2/v4/token";

    const post_body = `grant_type=refresh_token&client_id=${encodeURIComponent(client_id)}&client_secret=${encodeURIComponent(client_secret)}&refresh_token=${encodeURIComponent(refresh_token)}`;

    let refresh_request = {
        body: post_body,
        method: "POST",
        headers: new Headers({
            'Content-Type': 'application/x-www-form-urlencoded'
        })
    }

    // post to the refresh endpoint, parse the json response and use the access token to call files.list
    fetch(refresh_url, refresh_request).then( response => {
            return(response.json());
        }).then( response_json =>  {
            console.log(response_json);
            files_list(response_json.access_token);
    });
}

// a quick and dirty function to list some Drive files using the newly acquired access token
function files_list (access_token) {
    const drive_url = "https://www.googleapis.com/drive/v3/files";
    let drive_request = {
        method: "GET",
        headers: new Headers({
            Authorization: "Bearer "+access_token
        })
    }
    fetch(drive_url, drive_request).then( response => {
        return(response.json());
    }).then( list =>  {
        console.log("Found a file called "+list.files[0].name);
    });
}

get_access_token_using_saved_refresh_token();
于 2013-11-04T11:37:23.387 に答える
7

pinoyyid の優れた回答に代替ルートを追加さ​​せてください (これは私にとってはうまくいきませんでした - リダイレクト エラーをポップします)。

OAuthPlayground を使用する代わりに、HTTP REST API を直接使用することもできます。pinoyyid の回答との違いは、ローカルで処理を行うということです。pinoyyid の回答の手順 1 ~ 3 に従います。私はそれらを引用します:

  1. Google アカウントを作成します (例: my.drive.app@gmail.com) - または、既存のアカウントを使用している場合は、この手順をスキップしてください。
  2. API コンソールを使用して mydriveapp を登録します ( https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveappまたは単にhttps://console.developers.google.com/apis/ ) 。
  3. 新しい資格情報のセットを作成します (サービス アカウント キーではなく NB OAuth クライアント ID を選択し、選択項目から [Web アプリケーション] を選択します)。

次に、プレイグラウンドの代わりに、資格情報に次を追加します。

承認された JavaScript ソース: http://localhost (これが必要かどうかはわかりませんが、実行してください。)
承認されたリダイレクト URI: http://localhost:8080

スクリーンショット (ドイツ語):

OAuth ソース/リダイレクト設定

下の青いボタンから実際に変更を保存してください。

ここで、おそらく GUI を使用して HTTP 要求を作成したいと思うでしょう。私はInsomniaを使用しましたが、 Postmanまたはプレーンな cURLを使用できます。同意画面を簡単に通過できるため、Insomniaをお勧めします.

次のパラメーターを使用して、新しいGET要求を作成します。

URL: https://accounts.google.com/o/oauth2/v2/auth
Query Param: redirect_uri=http://localhost:8080
Query Param: prompt=consent
Query Param: response_type=code
Query Param: client_id=<your client id from OAuth credentials>
Query Param: scope=<your chosen scopes, e.g. https://www.googleapis.com/auth/drive.file>
Query Param: access_type=offline

選択したツールが URL エンコーディングを自動的に処理しない場合は、自分で正しく処理してください。

リクエストを送信する前に、リッスンする Web サーバーをセットアップしますhttp://localhost:8080。node と npm が run をインストールしている場合はnpm i express、次を作成しますindex.js

var express = require('express');
var app = express();

app.get('/', function (req, res) {
  res.send('ok');
  console.log(req)
});

app.listen(8080, function () {
  console.log('Listening on port 8080!');
});

を介してサーバーを実行しますnode index.jsreqオブジェクト全体をログに記録しないかnode index.js | less、完全な出力のために実行することをお勧めします。
他の言語にも非常に簡単な解決策があります。たとえば、PHP の組み込み Web サーバーを 8080 で使用しますphp -S localhost:8080

(Insomnia で) リクエストを発行すると、ログインのプロンプトが表示されます。

ログインプロンプト

電子メールとパスワードでログインし、同意画面を確認します (選択したスコープが含まれている必要があります)。

ターミナルに戻り、出力を確認します。すべてをログに記録した場合は、code=4/....

そのコードをコピーします。アクセス トークンとリフレッシュ トークンと交換するのは、認証コードです。コピーしすぎないでください。アンパサンドがある場合&は、それ以降をコピーしないでください。&クエリ パラメータを区切ります。が欲しいだけですcode

https://www.googleapis.com/oauth2/v4/tokenここで、エンコードされたフォーム URLを指す HTTP POST リクエストを設定します。Insomnia では、それをクリックするだけで済みます。他のツールでは、自分でヘッダーを に設定する必要がある場合がありますContent-Type: application/x-www-form-urlencoded

次のパラメーターを追加します。

code=<the authorization code from the last step>
client_id=<your client ID again>
client_secret=<your client secret from the OAuth credentials>
redirect_uri=http://localhost:8080
grant_type=authorization_code

繰り返しますが、エンコーディングが正しいことを確認してください。

リクエストを起動し、サーバーからの出力を確認します。応答には、JSON オブジェクトが表示されます。

{
  "access_token": "xxxx",
  "expires_in": 3600,
  "refresh_token": "1/xxxx",
  "scope": "https://www.googleapis.com/auth/drive.file",
  "token_type": "Bearer"
}

access_tokenすぐに使用できますが、有効期限は 1 時間です。リフレッシュ トークンに注意してください。これは、いつでも*新しいアクセス トークンと交換できるものです。

*ユーザーがパスワードを変更したり、アクセス権を取り消したり、6 か月間非アクティブになったりした場合は、この手順を繰り返す必要があります。

ハッピーOAuthing !

于 2019-03-14T14:06:30.500 に答える