Hatena::ブログ(Diary)

r-weblife RSSフィード Twitter

2011/03/23

OAuth 2.0のToken無効化に関する仕様について調べた

こんばんは、ritouです。

久々なので、短めな仕様を調べました。

draft-lodderstedt-oauth-revocation-02 - Token Revocation

Refresh/Access Tokenの無効化

OAuthのToken無効化と言えば、Twitterで怪しげなClientの暴挙を止めるためにAccess TokenをRevokeするという場面が思い浮かぶかと思います。

Token無効化は、セキュリティや使いやすさととても深く関連しています。TwitterのOAuthさんは私たちにいろいろなことを教えてくれますね。

今回の仕様では、ClientからAuthZ ServerにToken無効化のリクエストを送る方法が定義されています。

Clientは、AuthZ Serverのドキュメント等に書いてあるToken Revocation Endpointに次のようなリクエストを送ります。

  • HTTP POST(MUST)
  • TLS 1.2(MUST)
  • "application/x-www-form-urlencoded"

パラメータは以下のとおりです。

  • token : Revoke対象のToken 種類(Access/Refresh)は実装に依存され、AuthZ Serverはそれをしれっと特定する
  • Client Credential : client_id/client_secretなど

サンプル:

POST /revoke HTTP/1.1

Host: server.example.com

Content-Type: application/x-www-form-urlencoded

token=45ghiukldjahdnhzdauz&

client_id=s6BhdRkqt3&

client_secret=gX1fBat3bV

簡単ですね。

AuthZ Serverの処理

  1. Client Credentialの検証。Tokenを受け取ったClientのみがRevokeできるとかの仕様はAuthZ Serverの実装に依存
  2. Tokenの無効化。まぁすぐに反映されるかなどは実装依存

Refresh Tokenが指定された場合、関連する全てのAccess Tokenを無効する。

レスポンスは、次のようになります。

  • 200 : 成功
  • 401 : Client認証失敗
  • 403 : Token無効化の権限なし
  • 400 : その他多くのエラー

その他のエラーとして、次の2つが定義されています。

  • unsupported_token_type : 指定されたTokenの種類がサポートされていなかった場合
  • invalid_token : 既に無効なTokenの場合

以上です。

全体的にシンプルですね。

ただ、これだけならRevocation専用ではなく、Token Endpointと共存できるような仕様にしておいても良いのかなって思います。なんて考えましたが、今のOAuth 2.0の仕様ではToken EndpointにAccess Tokenを取得するリクエストが集約されているので、別でいいですね。

この仕様が実装されると、Client側からも明確に"もらったTokenは完全に廃棄しましたよ"と言えるので、安全面でも素晴らしいですね。

(訂正)この仕様が実装されると、Client側が不要になったTokenを自ら廃棄できるようになるので、今までよりも少しだけ安全な世の中になるかもしれませんね。

TwitterのOAuthは信用できないので、是非mixiさんあたりには実装していただきたいものです。

ではまた!

asannouasannou 2011/03/23 23:19 Clientが"もらったパスワードは保存してませんよ"って言うのと同じくらい信用できないのでは?

ritouritou 2011/03/24 07:11 はい、結局Userが自分でTokenの状態確認しないと心は落ち着きませんね。

トラックバック - http://d.hatena.ne.jp/ritou/20110323/1300888935