LoginSignup
6
1

More than 5 years have passed since last update.

OpenAMでOAuth 2.0 Device Flow

Posted at

Web Viewや外部のブラウザが利用できないデバイス

スマートフォン上で動作するネイティブアプリや、ブラウザ上で動作するシングルページアプリケーションであれば、ユーザー認証・認可をすることができます。しかし、セットトップボックスや〇〇tvみたいなデバイスの多くはサインイン画面を表示できないため、こういったデバイス向けのインターフェースが必要となります。

010.jpg

OAuth 2.0 Device Flow

UIをもたないClient向けにAccess Tokenを発行するフローがOAuth 2.0 Device Flowです。現在はドラフトスペックですが、以下に定義されています。

たぶん、説明するより図を見た方がわかりやすいと思います。

認証はResource Ownerが持っている別のUI(ブラウザなど)で行うんですが、Authorization Requestとの紐づけをVerification Codeで行っています。Verificationが行われるまでClientはPollingします。その後、Authorization ServerからAccess Tokenが発行されます。

tv-player

このDevice FlowをOpenAMで試すためのClientアプリがgithub上に公開されています。

OpenAMにClient登録

いつも通り、管理者アカウント(amadmin)でサインインします。

Application -> OAuth 2.0から以下の設定をし、クライアント登録をします。

key value
client id TVPlayer
client secret Passw0rd
scope givenname postaladdress description

002.JPG

tv-playerのセットアップ

まず、npmをインストールします

$ yum -y install npm
$ node -v
v0.10.46

tv-playerをgit cloneします。

$ git clone https://github.com/smof/tv-player.git

今回利用しているOpenAMの構成に合うように、ソースを少し修正します。

$ cd ./tv-player
$ sed -i 's/openam\(\.example\.com\)/iam\1/' routes/pair.js 
$ sed -i 's/openam\(\.example\.com\)/iam\1/' routes/pairNotification.js 
$ sed -i 's/openam\(\.example\.com\)/iam\1/' routes/favourites.js 

ちなみにソース上でこんな設定がされています。

        //OAuth2 client details
        var CLIENTID="TVPlayer";
        var CLIENTSECRET="Passw0rd";
        var RESPONSE_TYPE="token";
        var SCOPE="description%20givenname%20postaladdress";
        //Base64 encoded OAuth2 client credentials
        var CLIENTCREDS = CLIENTID + ":" + CLIENTSECRET;
        var B64CLIENTCREDS = new Buffer(CLIENTCREDS).toString('base64');

        //Variable sent in the post request
        deviceCode=req.body.deviceCode;
        console.log("DeviceCode: " + deviceCode);


        //Create HTTP request to query OpenAM to see if authorization has taken place
        var options = {
                          host: 'iam.example.com',
                          path: '/openam/oauth2/access_token',
                          port: '8080',
                          method: 'POST',
                      headers:  {'Content-Type' : 'application/x-www-form-urlencoded'}
        };

tv-playerを起動します。

# node app.js

ポート番号3001にて、起動されています。

003.JPG

動作確認する

人っぽいアイコンをクリックします。

003.JPG

QRコードが表示されますので、読み取ります。このコードを読み取ると、外部ブラウザが起動され、以下のURLにアクセスします。
Query StringでVerification CodeをAuthorization Serverに送信しています。

  • http://iam.example.com:8080/openam/oauth2/device/user?user_code=********

004.JPG

外部ブラウザ上ではOpenAMのサインイン画面が表示されますので、johndでサインインします。

005.JPG

先ほど送信したVerification Codeは、tv-playerから送信されたAuthorization Requestに紐づいているので、認可同意画面にもtv-playerからのclaimが表示されます。

006.JPG

同意すると、Done!!となります。

007.JPG

tv-playerの画面にもどると、ペアリングが完了しています。

008.JPG

ホームに戻ると、tv-player上ではサインインしていませんが、access tokenの取得が出来ていますので、そのaccess tokenを使って、ユーザーIDの取得ができています。

009][.JPG

OAuth 2.0では認証そのものの手段やフローは定義されていません。なので、Device FlowのようにOut of Band Authenticationでも問題ありません。おもしろいユースケースですね~。

あと2日か~。なにしようかな~?

ばい!

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1