バックグラウンドサービスでドライブファイルにアクセスする必要があるWebアプリがあるとします。アクセスするファイルを所有するか、所有者がドキュメントを共有しているGoogleアカウントで実行されます。
アプリには更新トークンが必要であることを理解していますが、それを取得するためのコードを書きたくない一度しか実行しないので。
NB。これはサービスアカウントを使用していません。アプリは従来のGoogleアカウントで実行されます。サービスアカウントは、状況によっては有効なアプローチです。ただし、Oauth Playgroundを使用してアプリをシミュレートする手法は、多くの冗長な労力を節約でき、サービスアカウントへの共有がサポートされていないすべてのAPIに適用されます。
これは https://developers.google.com/oauthplayground のOauth2 Playgroundで行うことができます
手順:-
Credentials/Create Credentials/OAuth Client Id
その後、Web application
を選択しますこれでアプリが無人で実行できるようになり、説明に従って 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();
Pinoyyidの優れた答えに別のルートを追加させてください(リダイレクトエラーをポップする-私にとってはうまくいきませんでした)。
OAuthPlaygroundを使用する代わりに、HTTP REST APIを直接使用することもできます。したがって、pinoyyidの答えとの違いは、ローカルで処理することです。pinoyyidの答えから手順1〜3に従ってください。それらを引用します:
ここで、遊び場の代わりに、資格情報に次を追加します。
許可されたJavaScriptソース:http:// localhost (これが必要かどうかはわかりませんが、それを行うだけです。)
承認済みリダイレクトURI:http:// localhost:808
スクリーンショット(ドイツ語):
下の青いボタンを使用して、変更を実際に保存してください!
おそらく、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で)リクエストを実行すると、ログインのプロンプトが表示されます。
電子メールとパスワードを使用してログインし、同意画面を確認します(選択した範囲が含まれている必要があります)。
端末に戻り、出力を確認します。 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!