web-dev-qa-db-ja.com

ユーザーの介入なしにアプリ(Webまたはインストール済み)を承認するにはどうすればよいですか?

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

アプリには更新トークンが必要であることを理解していますが、それを取得するためのコードを書きたくない一度しか実行しないので。

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

59
pinoyyid

これは https://developers.google.com/oauthplayground のOauth2 Playgroundで行うことができます

手順:-

  1. Googleアカウントを作成します(例:[email protected])-または、既存のアカウントを使用している場合はこの手順をスキップします。
  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. https://developers.google.com/oauthplayground を有効なリダイレクトURIとして含める
  5. クライアントID(Webアプリ)とクライアントシークレットに注意してください
  6. [email protected]としてログインします
  7. Oauth2プレイグラウンドに移動
  8. [設定](歯車アイコン)で、を設定します
    • Oauthフロー:サーバー
    • アクセスタイプ:オフライン
    • 独自のOAuth=資格情報を使用:TICK
    • クライアントIDとクライアントシークレット:ステップ5から
  9. ステップ1をクリックして、Drive APIを選択します https://www.googleapis.com/auth/drive (この手法は、リストされているすべてのGoogle APIでも機能します)
  10. [APIの認証]をクリックします。 Googleアカウントを選択してアクセスを確認するよう求められます
  11. ステップ2および「トークンの認証コードを交換する」をクリックします
  12. 返された更新トークンをコピーして、アプリ、ソースコード、またはアプリが取得できる場所の何らかの形式のストレージに貼り付けます。

これでアプリが無人で実行できるようになり、説明に従って https://developers.google.com/accounts/docs/OAuth2WebServer#offline のように更新トークンを使用してアクセストークンを取得できます。

NB。更新トークンはGoogleによって期限切れになる可能性があるため、新しい更新トークンを取得するには手順5以降を繰り返す必要があることに注意してください。この症状は、更新トークンを使用しようとしたときに返される無効な付与です。

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

このGoogleビデオにリンクしているWoodyのコメントをご覧ください https://www.youtube.com/watch?v=hfWe1gPCnzc

。 。 。

OAuth Playgroundの更新トークンを使用していくつかのドライブファイルを一覧表示する方法を示す簡単なJavaScriptルーチンです。単純にコピーしてChrome = devコンソール、またはノードで実行しますもちろん、独自の資格情報を提供します(以下はすべて偽物です)。

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();
117
pinoyyid

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

OAuthPlaygroundを使用する代わりに、HTTP REST APIを直接使用することもできます。したがって、pinoyyidの答えとの違いは、ローカルで処理することです。pinoyyidの答えから手順1〜3に従ってください。それらを引用します:

  1. Googleアカウントを作成します(例:[email protected])-または、既存のアカウントを使用している場合はこの手順をスキップします。
  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:808

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

OAuth source/redirect settings

下の青いボタンを使用して、変更を実際に保存してください!

おそらく、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エンコードを自動的に処理しない場合は、自分で正しく設定してください。

リクエストを実行する前に、http://localhost:8080でリッスンするWebサーバーを設定します。ノードとnpmがインストールされている場合、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.js経由でサーバーを実行します。 reqオブジェクト全体をログに記録しないか、node index.js | lessを実行して出力全体を巨大化することをお勧めします。
他の言語にも非常にシンプルなソリューションがあります。例えば。 8080 php -S localhost:8080のPHPに組み込まれたWebサーバーを使用します。

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

login Prompt

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

端末に戻り、出力を確認します。 code=4/...を含む行が表示されるまで、すべてをログに記録した場合は、下にスクロールします(たとえば、pgdown未満)。

そのコードをコピーしてください。アクセストークンと更新トークンと交換するのは認証コードです。コピーしすぎないでください-アンパサンドがある場合は&またはそれ以降をコピーしないでください。 &はクエリパラメータを区切ります。 codeだけが必要です。

HTTP POST https://www.googleapis.com/oauth2/v4/tokenを指すリクエストをform URL encodedとして設定します。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

2
m02ph3u5