[解決済み] ユーザーの介入なしにアプリ(ウェブまたはインストール済み)を認証するにはどうすればよいですか?
質問
バックグラウンド サービスで Drive ファイルにアクセスする必要がある Web アプリ ("mydriveapp") があるとします。このアプリは、アクセスするファイルを所有するか、所有者がドキュメントを共有している Google アカウントで実行されます。
私のアプリがリフレッシュ トークンを必要とすることは理解しています。 を取得するためのコードを書きたくありません。 を取得するコードは書きたくありません。
注意。これはサービスアカウントを使用するものではありません。 アプリは従来のGoogleアカウントで実行されます。サービスアカウントは、いくつかの状況では有効なアプローチです。しかし、アプリをシミュレートするためにOauth Playgroundを使用する手法は、冗長な労力の多くを節約することができ、サービスアカウントへの共有がサポートされていないすべてのAPIに適用されます。
どのように解決するのですか?
これは、以下の Oauth2 プレイグラウンドで行うことができます。 https://developers.google.com/oauthplayground
ステップ:-)
- Google アカウントを作成します (例: [email protected]) - または、既存のアカウントを使用している場合は、この手順をスキップします。
- API コンソールを使用して、mydriveapp を登録します ( https://console.developers.google.com/apis/credentials/oauthclient?project=mydriveapp または単に https://console.developers.google.com/apis/ )
-
新しいクレデンシャルのセットを作成します。
Credentials/Create Credentials/OAuth Client Id
を選択しWeb application
- 以下を含む https://developers.google.com/oauthplayground を有効なリダイレクトURIとする
- クライアントID(ウェブアプリ)とクライアントシークレットをメモする
- [email protected] としてログインします。
- Oauth2 プレイグラウンドに移動します。
-
設定(歯車アイコン)で
- OAuthの流れ。サーバーサイド
- アクセスタイプ。オフライン
- 独自のOAuth認証情報を使用します。TICK
- クライアントIDおよびクライアントシークレット: ステップ5より
- ステップ 1 をクリックし、Drive API v3 を選択します。 https://www.googleapis.com/auth/drive (このテクニックは、リストアップされたGoogle APIのどれにも当てはまります。)
- API の認証] をクリックします。Google アカウントを選択し、アクセスを確認するプロンプトが表示されます。
- Step 2 と "Exchange authorization code for tokens" をクリックします。
- 返された Refresh トークンをコピーし、アプリ、ソース コード、またはアプリが取得できる何らかのストレージに貼り付けます。
これで、アプリは無人で実行され、次のようにリフレッシュ トークンを使用できるようになります。 https://developers.google.com/accounts/docs/OAuth2WebServer#offline を使用して、アクセストークンを取得することができます。
注意 リフレッシュトークンはGoogleによって失効されることがあり、その場合は新しいリフレッシュトークンを取得するために手順5以降を繰り返す必要があることに注意してください。この場合、リフレッシュトークンを使用しようとすると、無効なグラントが返されることになります。
注2. このテクニックは、独自の(そして だけ にアクセスするためのWebアプリを作成する場合に有効です。手順 1 をスキップし、手順 6 で "my.drive.app" を自分の電子メール アドレスに置き換えるだけです。
以下の Woody のコメントで、この Google ビデオへのリンクを参照してください。 https://www.youtube.com/watch?v=hfWe1gPCnzc
. . .
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();
関連
-
[解決済み] Drive APIを使用してGoogle Docをコピーする際に、コメントや提案をコピーすることは可能ですか?
-
[解決済み] invalid_grant google から oAuth トークンを取得しようとしています。
-
[解決済み] gspread.exceptions.SpreadsheetNotFoundを使用する。
-
[解決済み] Google Calendar APIのコンテキストにおける404とはどういう意味ですか?
-
[解決済み】Googleウェブ検索APIが非推奨となった今、代替となるものは何ですか?[終了しました]
-
[解決済み】Google KeepのAPIはありますか?[クローズド]
-
[解決済み】エラー:invalid_client no application name
-
[解決済み] Google refresh トークンに有効期限はありますか?
-
[解決済み] Google+ APIはすでにある?[クローズド]
-
[解決済み] Google+のプロフィール画像のurlをuser_idで取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Drive APIを使用してGoogle Docをコピーする際に、コメントや提案をコピーすることは可能ですか?
-
[解決済み] invalid_grant google から oAuth トークンを取得しようとしています。
-
[解決済み] gspread.exceptions.SpreadsheetNotFoundを使用する。
-
[解決済み] Google Calendar APIのコンテキストにおける404とはどういう意味ですか?
-
[解決済み】Googleウェブ検索APIが非推奨となった今、代替となるものは何ですか?[終了しました]
-
[解決済み】Google KeepのAPIはありますか?[クローズド]
-
[解決済み】エラー:invalid_client no application name
-
[解決済み] Google refresh トークンに有効期限はありますか?
-
[解決済み] Google+ APIはすでにある?[クローズド]
-
[解決済み] Google+のプロフィール画像のurlをuser_idで取得する