1. ホーム
  2. google-api

[解決済み] ユーザーの介入なしにアプリ(ウェブまたはインストール済み)を認証するにはどうすればよいですか?

2023-04-12 06:44:51

質問

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

私のアプリがリフレッシュ トークンを必要とすることは理解しています。 を取得するためのコードを書きたくありません。 を取得するコードは書きたくありません。

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

どのように解決するのですか?

これは、以下の Oauth2 プレイグラウンドで行うことができます。 https://developers.google.com/oauthplayground

ステップ:-)

  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(ウェブアプリ)とクライアントシークレットをメモする
  6. [email protected] としてログインします。
  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. Step 2 と "Exchange authorization code for tokens" をクリックします。
  12. 返された 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();