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

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

私のアプリがリフレッシュトークンを必要とすることは理解していますが、私はそれを取得するためのコードを書きたくありません なぜなら、私はそれを一度だけ行うからです。

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

ソリューション

これは、Oauth2 Playground(https://developers.google.com/oauthplayground)を使って行うことができます

手順:-)

1.Google アカウントを作成する (例: my.drive.app@gmail.com) - または、既存のアカウントを使用している場合は、この手順をスキップします。
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アプリケーション)とクライアントシークレットを記録する。 1.my.drive.app@gmail.com としてログインする。 1.Oauth2プレイグラウンドに移動 1.設定(歯車のアイコン)で、以下を設定します。

  • Oauthフロー: サーバ
  • アクセスタイプ: オフライン
  • OAuthの認証情報を使用します。TICK
  • クライアントID、クライアントシークレット:手順5より 1.Step 1をクリックし、Drive API https://www.googleapis.com/auth/drive を選択します(この方法は、Google APIのいずれにも適用できます)。 1.APIを認証する]をクリックします。Googleアカウントを選択し、アクセスを確認するプロンプトが表示されます。 1.ステップ2とquot;Exchange Authorization code for tokens&quotをクリックします。 1.返されたRefresh Tokenをコピーし、アプリ、ソースコード、またはアプリが取得できる何らかのストレージに貼り付けます。

これで、アプリは無人で実行され、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のビデオ(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();
解説 (27)

pinoyyid'さんの素晴らしい回答(私の場合はうまくいきませんでした - リダイレクトエラーが出ます)に別のルートを追加させてください。

OAuthPlayground を使用する代わりに、HTTP REST API を直接使用することもできます。pinoyyid'の回答との違いは、ローカルで行うことです。pinoyyid's の回答のステップ 1 ~ 3 に従ってください。引用します。

1.1. Googleアカウントを作成する (例: my.drive.app@gmail.com) - 既存のアカウントを使用している場合は、このステップは省略できます。 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

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

[OAuthソース/リダイレクト設定]]1

下の青いボタンから変更を 実際に 保存することを確認してください!

ここで、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=
Query Param: scope=
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= client_id= client_secret= redirect_uri=http://localhost:8080 grant_type=authorization_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!

解説 (2)