Introduction
限られた入力機器しかもたない端末では、ただFacebookにログインするためにemailアドレスとパスワードを入力させると言うのは厄介です。Facebook Platformは、素早く簡単に使える代替手段として、device flowと呼ばれる認証フローを提供しています。このdevice flowを使うと、ユーザは単に端末上のボタンを押すだけで、webブラウザ上のユーザフレンドリなインターフェイスを通じてログインできます。
Device Flow
Facebookのdevice flowの実装はSection 3.7 of the OAuth 2.05 specificationを基にしています。仕様と実装のいずれもコンスタントに改善されてはいますので、多少は相違が生まれるかもしれません。認証に用いられるのは4つのパートから成るプロセスです。
- 端末はGraph APIを通じて認証リクエストを送り、その際、クエリパラメータでtype,client_idが渡されます。この初期リクエストはtype=device_codeを渡す必要があります。client_idはクライアントのFacebookアプリケーションIDです。クライアントはscopeパラメータを通じてextended permissionを要求することができます。Extended permissionが含まれた場合、other authentication flowsと同じように解釈されます。リクエストはまた、formatパラメータも渡すことができますが、今のところJSON形式のみサポートしていますので、このパラメータを含むのは単に余分です。
https://graph.facebook.com/oauth/device?type=device_code&client_id=...
正しい形式で渡ってきたリクエストへのレスポンスとして、Facebookの認証サーバはverification_code (code) と a user code (user_code)を生成します。codeとuser_codeはverification_uriと共に、HTTPステータス200レスポンスのボディ内で、JSONエンコードされた配列としてクライアント側へ渡されます。verification_codeは、認証フローでFacebookサーバのコミュニケーションを取る際にクライアントを特定するものなので、これはクライアントのみに見えるべきであり、エンドユーザには見えるべきではありません。次にユーザは、サーバから返されるverification_uriに対してwebブラウザでアクセスしてuser_codeを入力しなくてはなりません。このプロセスでサーバは、Facebookアカウントのユーザデータにアクセスできるようにクライアント端末を認証します。
それと同時に、端末はポーリングして認証されたかどうかを判断します。これはGraph APIリクエストを通じて行われます。このリクエストはtype=device_token, client_id (クライアントのFacebookアプリケーションID), code(オリジナルのリクエストでサーバから返されたverification code)パラメータを渡さなくてはなりません。
https://graph.facebook.com/oauth/device?type=device_token&client_id=...&code=...
- オリジナルのdevice_codeリクエストのあと、端末は合理的なインターバルを置いてdevice_tokenリクエストと共にポーリングを始められます。正しい形式で渡ってきたリクエストへのレスポンスとして、Facebook認証サーバは以下の3つのレスポンスのうち一つを返します。エンドユーザが端末を認証していない場合、サーバはHTTPステータス400 Bad Requestレスポンスと共にJSON形式で"error : authorization_pending"を返します。このメッセージは端末がポーリングを続けるべきであることを意味します。エンドユーザが端末の認証を拒否した場合、HTTP 400 Bad Requestレスポンスと共にJSON形式で"error : authorization_declined"を返します。これは認証が失敗し、ポーリングをやめるべきだということを意味します。それ以後も認証を試みるのなら、フローを最初からやり直さなくてはなりません。エンドユーザがverification_uriで端末を認証した場合、サーバはHTTP 200 OKレスポンスと共に、OAuth access_tokenをJSON形式で返します。この時点では、端末は他のOAuth認証フローと同じように完全に認証されていて、access_tokenを用いてAPIを利用できます。
それだけです!これであなたの端末はFacebookに繋がりました!
FAQs
HTTPを用いてdevice flowを行えますか?
- いいえ、OAuth 2はTLS/HTTPSを必須としています。
GETメソッドを用いてdevice flowを行えますか?
- いいえ、device flowにはPOSTリクエストが必須です。