例えば、Driveのファイルにバックグラウンドでアクセスする必要があるWebアプリがあるとします。このアプリは、アクセスするファイルを所有するか、所有者がドキュメントを共有しているGoogleアカウントで実行されます。
私のアプリがリフレッシュトークンを必要とすることは理解していますが、私はそれを取得するためのコードを書きたくありません なぜなら、私はそれを一度だけ行うからです。
**NB.このアプリは、従来のGoogleアカウントで実行されます。サービスアカウントは、ある状況下では有効なアプローチです。しかし、アプリをシミュレートするためにOauth Playgroundを使用する手法は、冗長な労力の多くを節約することができ、サービスアカウントへの共有がサポートされていない任意のAPIに適用されます。
これは、Oauth2 Playground(https://developers.google.com/oauthplayground)を使って行うことができます。
手順:-)
1.Google アカウントを作成する (例: [email protected]) - または、既存のアカウントを使用している場合は、この手順をスキップします。
2.2. API コンソールを使用して mydriveapp を登録します (https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp または https://console.developers.google.com/apis/ のみ)。
1.新しいクレデンシャルセットを作成します。資格情報/資格情報の作成/OAuthクライアントIDを選択し、
Webアプリケーション`を選択します。
1.有効なリダイレクトURIとして、https://developers.google.com/oauthplayground を含めます。
1.クライアントID(Webアプリケーション)とクライアントシークレットを記録する。
[email protected] としてログインする。
1.Oauth2プレイグラウンドに移動
1.設定(歯車のアイコン)で、以下を設定します。
これで、アプリは無人で実行され、https://developers.google.com/accounts/docs/OAuth2WebServer#offline に記載されているように Refresh Token を使用して Access Token を取得することができるようになります。
注意リフレッシュ・トークンはGoogleによって期限切れにされることがあるので、その場合は新しいリフレッシュ・トークンを取得するために手順5以降を繰り返す必要があることに注意してください。この場合、リフレッシュトークンを使用しようとすると、Invalid Grantが返されることになります。
注意2.このテクニックは、自分自身(および 自分自身のみ)のDriveアカウントにアクセスするWebアプリを作成する場合に有効で、一度だけ実行される認証コードをわざわざ記述する必要はありません。ステップ1をスキップし、ステップ6で "my.drive.app" を自分の電子メールアドレスに置き換えるだけです。
Woody'のコメントで、Googleのビデオ(
. . .
OAuth Playground の Refresh Token を使って Drive ファイルを一覧表示する方法を示す JavaScript ルーチンを紹介します。Chromeの開発コンソールにコピーペーストするか、nodeで実行することができます。もちろん、あなた自身の認証情報を提供してください(以下のものはすべて偽者です)。
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's の回答のステップ 1 ~ 3 に従ってください。引用します。
1.1. Googleアカウントを作成する (例: [email protected]) - 既存のアカウントを使用している場合は、このステップは省略できます。 2.2. APIコンソールを使用して、mydriveappを登録します (https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp または https://console.developers.google.com/apis/ のみ)。 3.3. 新しい認証情報を作成します(NB OAuth Client ID not Service Account Key と選択から "Web Application" を選択します)。
ここで、playgroundの代わりに、以下を認証情報に追加します。
Authorized JavaScript Sources: http://localhost (これが必須かどうかはわかりませんが、やっておきましょう。) 認可されたリダイレクトURI: http://localhost:8080
スクリーンショット(ドイツ語)。
下の青いボタンから変更を 実際に 保存することを確認してください!
ここで、HTTPリクエストを作成するためにGUIを使用したいと思うでしょう。私は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
をリッスンするウェブサーバーをセットアップしてください。nodeとnpmがインストールされている場合は、npm i express
を実行し、index.js
を作成します。
``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` を実行すると、全部の出力が巨大になるため、推奨します。
他の言語でも、非常に簡単な解決策があります。例えば、PHPに内蔵された8080のウェブサーバー `php -S localhost:8080` を使用します。
これで (Insomnia で) リクエストを実行すると、ログインを促されるはずです。
[![ログインプロンプト][4]][4]。
メールとパスワードでログインし、同意画面(選択したスコープが含まれているはずです)を確認します。
ターミナルに戻り、出力を確認します。もし全体をログに記録したなら、`code=4/...` の行が見えるまでスクロールダウン (例: less の pgdown) してください。
これがあなたの認証コードで、アクセストークンやリフレッシュトークンと交換したいものです。アンパサンド(`'`)がある場合は、それ以降をコピーしないでください。クエリパラメータは `&` で区切られます。私たちは `code` が欲しいだけなのです。
HTTP POST リクエストを設定し、`https://www.googleapis.com/oauth2/v4/token` を *form URL encoded* として指定します。他のツールではヘッダーを `Content-Type: application/x-www-form-urlencoded` に設定しなければならないかもしれません。
以下のパラメータを追加してください。
code=
ここでも、エンコーディングが正しいことを確認してください。
リクエストを実行し、サーバーからの出力を確認してください。レスポンスには、JSONオブジェクトが表示されるはずです。
``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ヶ月間活動を停止した場合などには、この手順を繰り返さなければなりません。
それでは、Happy OAuthing!