2019の4日目の記事です。Grantを理解する必要があったので、お勉強した記録を整理しました。概要を説明したあと、Googleの認可サーバーからcurlとブラウザでシュッとアクセストークンをとるところを書いています。GrantのRFCはこちらです。Standardです。条件を満たすデバイスのためのOAuthのグラントタイプです。request.インターネットにつながっていて、HTTPSリクエストをなげることができて、ディスプレイなどURIとコードをユーザーに表示する手段をもっているデバイスということですね。これにくわえて、ユーザーがスマホやPCももっていることを前提としています。これを満たすデバイスとしてパッと思いつくのはテレビですかね。他に何があるのか調べてみたところAuth0のブログには例えば以下のようなものが挙げられてました。(カッコのなかは僕の補足です。)複合機(コピー機のすごいやつ)フィットネストラッカ(fitbitとか?)ゲームコンソール(プレステをYoutubeにつなぐとか?)冷蔵庫(これは使われ方がよくわからん。ドライブにつなげるとかですかね。ユーザーコードを表示するLEDパネルなどの手段は必要です。ユーザーコードについては後述します。シーケンス概要シーケンス図は以下になります。デバイスが2つ登場します。右にいるのがテレビなど上記の一覧のものに対応するデバイスです。左から二番目(Userの隣り)は要するにスマホやPCのブラウザです。Grantでもリソースオーナーの認証はブラウザで行われます。シーケンスを説明します。実際には任意のオプションがあったりするので厳密なところを知りたい方はRFCをあたってください。Clientからリクエストします。codeが返ってきます。codeを提示します。さきほど、「ラズパイにディスプレイが必要です。」といったのはここのことです。codeとURIを表示する必要があります。4番、5番でユーザーはブラウザを通して提示されたURIにアクセスします。6番、7番でリソースオーナとしての認証を行います。codeの入力画面を表示します。codeを入力します。10番でデバイスから認可サーバーにトークンリクエストを行います。ClientSecretが含まれます。(ClientSecretはなくていい場合もある)図では表現できていませんが、実際には2番のリクエストが返ってきてからデバイスは認可サーバーに対して定期的にリクエストを送っています。codeの入力が完了すると、トークンレスポンスとしてアクセストークンが返ります。アクセストークンをとってみようでは、実際にアクセストークンをとってみましょう。APIのアクセストークンを取得します。codeはフェイクの値をいれているので、適宜、ご自身のものに読替えてください。Platform(GCP)でクライアントを作成し、ClientID/ClientSecretを作成してください。APIの有効かもお願いします。このあたりが参考になります。Googleのこちらのドキュメントにそってリクエストをなげていきます。1番のリクエストをcurlコマンドにしたものが以下です。認可サーバーのエンドポイント"https://accounts.google.com/o/oauth2/device/code"に対してclient_idとscopeをpostで送信しています。scopeは"https://www.googleapis.com/auth/drive.file"になります。URLの形式をしているのでややこしいですが、scopeに指定する値です。APIのscopeの情報はこちらにあります。\https://accounts.google.com/o/oauth2/device/code2番のレスポンスは以下になります。ここでdevice_code、user_code、verification_uriがかえってきます。"https://www.google.com/device"}ここで渡されるverification_uriとuser_codeを何らかの形でユーザーに表示します。次にユーザーの立場に立ってverification_uriである"https://www.google.com/device"にアクセスしてください。codeの入力を求めてきます。以下のコード入力画面がが表示されるのでuser_codeの値を入力して「次へ」を押します。Googleのログイン画面がでるのでID/Passwordを入力してログインしてください以下の画面が表示され、権限移譲に関する許可を確認する画面がでます。ちなみにdevice-flow-appはクライアント作成時につけたアプリの名前です。許可ボタンをおすと以下完了画面が出ます。Client役に戻って10番のリクエストを送信します。Googleの場合、grant_typeの値として"http://oauth.net/grant_type/device/1.0"を指定しますが、RFCではこの値は"urn:ietf:params:oauth:grant-type:device_code"となっています。\https://oauth2.googleapis.com/token11番の以下のレスポンスが返ってきます。"Bearer"}access_tokenとrefresh_tokenが取得できました。アクセストークンの有効期限は3600秒ですね。Grantが想定しているデバイスについて概要説明とGoogleの認可サーバーから実際にアクセストークンを取得してみました。なんか間違えてたらtwitterの方にマサカリください。さんのPKCEの記事です。