Carpe Diem

備忘録

OAuth 2.0 Device Authorization Grant

概要

サービスのマルチデバイス対応をした際に、各デバイスで同じアカウントにログインするのはユーザにとっては非常に手間です。

例えばテレビデバイスに対応した場合にID&パスワードをリモコンで入力させるのはユーザにとって苦痛でしかありません。

なのでサービス側はユーザが苦労なくスムーズにログインできる方法を提供しなくてはいけませんが、一方でセキュリティについても気にする必要があります。

そんなケースの対応方法としてOAuth 2.0 Device Authorization Grantがあるので紹介します。

ユーザの体験

例としてテレビデバイスでログインします。
huluが体験として分かりやすいので実際にやってみます。

ログインしようとする

f:id:quoll00:20210201045708j:plain

コードが表示される

QRコードアクティベーションコードが表示されます。

f:id:quoll00:20210201045819j:plain

カメラで読み取る

QRコードをカメラで読み取ります。

f:id:quoll00:20210201050206j:plain

Webページに遷移

QRコードのWebページに遷移します。

未ログインの場合

未ログインだとログインするように言われます。

f:id:quoll00:20210201050156j:plain

ログイン済みの場合

ログイン済みだとコード入力された状態になります。

f:id:quoll00:20210201050216j:plain

これで「視聴機器を有効化」ボタンを押せばログイン完了です。
非常に簡単ですね。

システム

UXのイメージがついたところで、次にシステム側がどうなっているかを理解します。

シーケンス

システムのシーケンスは以下です。

f:id:quoll00:20210201052217p:plain

1. 未ログインデバイスでログインリクエス

リクエストパラメータは以下です。

パラメータ 要否 説明
client_id 必須 クライアントID
scope 任意 権限のスコープ

レスポンスパラメータは以下です。

パラメータ 要否 説明
device_code 必須 Device Code
user_code 必須 User Code
verification_uri 必須 エンドユーザー検証URI
verification_uri_complete 任意 user_code を含むエンドユーザー検証URI
expires_in 必須 device_codeuser_codeの有効期限(秒)
interval 任意 トークンリクエストのポーリング間隔(秒)

Authサーバ側はuser_codedevice_codeexpires_inの期限まで紐付けて持つ必要があります。

2. トークンリクエスト(ポーリング)

次にトークンが取得できるまで以下のパラメータを投げ続けます(ポーリング)

パラメータ 要否 説明
grant_type 必須 urn:ietf:params:oauth:grant-type:device_codeという固定値
device_code 必須 Device Code
client_id 必須 クライアントID

Authサーバはuser_codeのチェックが完了するまではauthorization_pendingエラーやslow_downエラーを返し続けます。

3. ログイン済みスマホバイスuser_codeを渡す

QRコードなどで読み込んでverification_uriのページに遷移します。

huluのようにuser_codeが入力された状態になるとユーザにとって非常に楽ですね。

4. user_codeをAuthサーバへ

未ログインであればログインを促します。

5. user_code検証

存在するuser_codeか、またexpires_inの期限内かをチェックします。

問題なければログインユーザと紐付けます。

6. ポーリングの完了

5.のチェックが通ればポーリングしていたリクエストのレスポンスとして、ブラウザでログインしていたユーザのアクセストークンが返ります。

7. リソースAPIの利用

アクセストークンを用いて各リソースのAPIを叩くことができます。

応用

バイス側は様々なパターンで利用可能です。

client_id毎にverification_uriをWeb用のHTTPスキーマであったり、ディープリンクを用いてネイティブ用にすればブラウザ側も柔軟に変更できます。

バイス側をネイティブアプリとした場合

U-NextのようなWebブラウザでログインができます。

f:id:quoll00:20210201055053p:plain

バイス側をWebブラウザ、ブラウザ側をネイティブアプリとした場合

アプリでログインしているアカウントにWebブラウザでもログインしたいといったケースでスムーズにログインできます。

まとめ

マルチデバイス対応した際にユーザがスムーズに各デバイスにログインできる方法としてDevice Authorization Grantを紹介しました。

参考