失効 (OAuth 2.0)

失効エンドポイント (OAuth 2.0)

[2] 失効エンドポイント (revocation endpoint) は、 アクセストークン更新トークン失効 (revocation) させる (revoke する) ためのエンドポイントです。

仕様書

意味

[3] 失効要求 (revocation request) は、 クライアントが自身の保持するアクセストークン更新トークンを無効化することを認可鯖に求めるものです。 >>1

[41] 認可サーバーは、 指定されたトークンを無効にすると共に、 関係する他のトークンセッションデータ等の関係するデータを消去できます >>1

[6] 実装は、 更新トークン失効に対応しなければなりません >>1

[7] 実装は、 アクセストークン失効に対応するべきです >>1

[8] しかしながら、 実装失効に対応すること自体は必須とはなっていません。 OAuth 本体に対応していても、失効には対応していない可能性があります。 また更新トークンを使わない実装更新トークン失効にも対応していない (できない) かもしれません。
[39] 更新トークン失効によりアクセストークン失効されることは保証されませんし、 されたかどうか直接知ることもできません。 確実に失効したければ両方を明示的に失効する必要があります。

[4] OAuth はしばしば Webアプリケーションログインの仕組みとして使われます。 そのようなWebアプリケーション (クライアント) は、 末端利用者 (資源所有者) がログアウトしたりアンインストールしたりした時に、 トークン失効させることができます。 >>1

[5] トークン失効させることで、 ログアウト等の後末端利用者が気づかないままトークンが残ってしまうことを防げますし、 乱用されることも防げます。 >>1

[42] クライアントrevoke するのは任意であり、末端利用者revoke したかどうか直接知ることができないので、クライアントが悪意を持っている場合の対策にはならず、 せいぜい流出した時の被害を抑えるくらいの役目しか果たしませんが...

[43] 認可鯖末端利用者に対して認可承諾の一覧を提示している場合には、 そこからも消去されるでしょう。 >>1 使わなくなったクライアントが一覧に残り続けるよりは良さそうです。

[24] クライアントは、 revokeエンドポイント200 を返した後そのトークンを使おうと試みてはなりません >>1

[26] なお、トークンはこの仕組み以外でも無効になることがあります。 クライアントは、いつでもトークンが無効にされる可能性を考慮しておかなければなりません >>1。例えば資源所有者revoke するかもしれませんし、 認可鯖が自身の判断で無効化するかもしれません。

クライアントの要求

[9] クライアントは、 POST 要求を使います >>1JSONP を使う場合には GET 要求でも構いません >>1

[13] クライアントrevokeエンドポイントURL を得る方法は、 OAuth 仕様の範囲外です。のドキュメントから調べても構いませんし、 自動的な発見の仕組みを使っても構いません。いずれにせよ信頼できる情報源に拠る必要があります。 >>1

[14] revokeエンドポイントURL は、 HTTPS でなければなりません認可鯖TLS を使わなければなりませんクライアントHTTPSURL であることを検証 (verify) しなければなりませんクライアントは偽のrevokeエンドポイントを検出するため、証明書の検証などにより認証しなければなりません>>1

[63] もし偽の失効エンドポイントのつもりで偽のエンドポイントにトークンを送ってしまうと、 有効なアクセストークン更新トークンを悪意ある者に送ってしまうことになり、 危険です。

[15] サーバーは、失効エンドポイント素のHTTP でも利用できるなら、 そちらでの失効にも対応するべきです。 しかしこれを失効エンドポイントURL として出版してはなりません>>1

[16] こうすることにより、誤って素のHTTP で送信してしまったトークンも失効できます >>1

[11] revokeエンドポイントURL は、 application/x-www-form-urlencoded 形式の query を含んでいても構いません >>1, >>10

[12] URL引数を追加する時は、元の query を残さなければなりません >>1, >>10

[17] クライアントPOST 要求payload body または JSONP GET 要求URL queryapplication/x-www-form-urlencoded 形式で次の引数を指定します >>1

payload body または URL query (application/x-www-form-urlencoded)
[18] token
revoke したいトークンを指定しなければなりません >>1
[19] token_type_hint
token の種別のヒントです。 クライアントはこれを指定しても構いません。 >>1
[33] callback
JSONP の場合に、 JavaScript 関数修飾名を指定します >>1

[20] クライアントは、クライアント認証 (または認証できない場合には client_id 引数) も含めます >>1

認可鯖の処理

[32] 認可鯖は、 利用者エージェントベースのアプリケーションで使われるかもしれない場合には、 CORS に対応して構いません >>1

[44] 特別な CSRF 対策は必要無さそうです。

[21] 認可鯖は、まず (機密クライアントなら) クライアントcredentials検証 (validate) します >>1

クライアント認証参照。RFC には明記されていませんが、 整合性を考えると機密でなくてもクライアントcredentialsが発行されている場合には検証するべきと思われます。

[22] 認可鯖は、次にトークンが当該クライアントに発行されたものか検証 (verify) します。 失敗した場合は、エラーを返して終わります。 >>1

[37] RFC には明記されていませんが、引数の重複や欠落などがあれば、 エラーを返して終わるべきと思われます。

[23] 認可鯖は、その後トークンを非妥当化します。非妥当化は直ちに行われ、 以後トークンは使えなくなります。実際には伝播遅延があるかもしれませんが、 できるだけ短期間で反映されるようにするべきです。 >>1

[29] token_type_hint の指定は、あまり意味がありません。

token_type_hint 参照。

[25] 認可鯖は、 revoke に関する方針次第で、 関連するトークンや元になった認可承諾をも revoke して構いません。 更新トークンrevoke においては、 認可鯖アクセストークンrevoke にも対応しているなら、同じ認可承諾に基づくすべてのアクセストークンをも revoke するべきです。 アクセストークンrevoke においては、 対応する更新トークンrevoke して構いません。 >>1

[27] 認可鯖は、 revoke に成功したい場合や、 非妥当なトークンが指定されていた場合は、 200 応答を返します >>1

[88] 認可鯖は、誤りの場合には、 400 応答で次の引数JSON (application/json) payload bodyJSONオブジェクトの名前と値 (文字列なら JSON文字列数値なら JSON数値) に含めます >>1, >>30

payload body (JSONオブジェクト)
[84] error
誤り符号を指定しなければなりません >>30
[85] error_description
人間可読誤りの説明を指定して構いません >>30
[86] error_uri
人間可読誤りの説明を含むWebページURL を指定して構いません >>30

[40] 認可鯖は、 DoS攻撃に注意しなければなりません >>1

[28] クライアントは、 200 応答payload body を無視します >>1

[31] クライアントは、 503 応答を受信したらトークンはまだ有効と判断しなければならず、 適当な間を置いて再試行して構いません。Retry-After: で利用できないと思われる期間を示すことができます。 >>1

[34] クライアントは、 JSONP の場合不正な revokeエンドポイントが不正なコードを注入する危険性があることに注意するべきです >>1

[35] そんなレベルで認可鯖が信用できない状況では OAuth 関連の処理がすべて危険そうですが...

歴史

[49] OAuth 1.0 本体には revoke API はありませんでした。

[53] OAuth Session Extensionrevoke API を規定していました >>52

[47] GoogleOAuth 1.0 アクセストークンについて、 AuthSubrevokeエンドポイントを使って revoke できる >>48 としていました。

[51] TwitterOAuth 2.0 向けに独自仕様の revokeエンドポイントを実装しています >>50

メモ

[36] RFC 7009OAuth 関連仕様の中でも特に品質が低いようです。 他の RFC を参照している箇所は章番号だけでどの規定が引用されているのか自明ではなかったりしますし、 事実の文による状況の説明ばかりで助動詞が含まれる規定の文は少なく、 前世紀レベルです。 JSONP に関する部分に至っては規定がほとんどなく例示に頼っています。

[38] RFC は未だに JSONP を考慮しているようですが、出版された2013年の時点ではぎりぎりまだ必要があったかもしれません。 現在では最早何の意味もなく、危険なだけなので CORS を使うべきでしょう。

[54] OAuth2 · reddit/reddit Wiki ( 版) https://github.com/reddit/reddit/wiki/OAuth2#user-content-manually-revoking-a-token

[55] OAuth 2.0 Authentication | Viadeo API ( 版) http://dev.viadeo.com/documentation/authentication/oauth-authentication/

In order to revoke a token (i.e. remove the bridge between your application and Viadeo) use  https://secure.viadeo.com/oauth-provider/revoke_access_token2 with access token as parameter

https://secure.viadeo.com/oauth-provider/revoke_access_token2?

client_id=<YOUR_API_KEY>&

client_secret=<YOUR_API_SECRET>&

redirect_uri=http://www.example.com/oauth_redirect&

access_token=<ACCESS_TOKEN_TO_REVOKE>

 

In response, you will get the following json response:

{"token_revoked"}

[56] OAuth | Heroku Dev Center ( 版) https://devcenter.heroku.com/articles/oauth#revoking-authorization

Revoking an authorization will block associated tokens from making further requests.

DELETE /oauth/authorizations/{authorization-id}

[57] Dropbox - Core API - endpoint reference ( 版) https://www.dropbox.com/developers/core/docs

/disable_access_tokenPythonJavaRubyPHP

DESCRIPTION

Disables the access token used to authenticate the call. This method works for OAuth 1 and OAuth 2 tokens.

URL STRUCTURE

https://api.dropbox.com/1/disable_access_token

METHOD

POST

RETURNS

An empty JSON dictionary, which indicates success.

[58] UserVoice OAuth Reference - UserVoice Developer (UserVoice 著, 版) https://developer.uservoice.com/docs/api/oauth/#_api_v1_oauth_request_token_

Revoke GET or POST /api/v1/oauth/revoke.json

[59] Authentication | feedly Cloud API ( 版) https://developer.feedly.com/v3/auth/#revoking-a-refresh-token

refresh_token

string The refresh token returned in the previous code.

client_id

string The clientId obtained during application registration.

client_secret

string The client secret obtained during application registration.

grant_type

string This field must contain a value of revoke_token.

[60] Strava API Authentication ( 版) https://strava.github.io/api/v3/oauth/

Deauthorization

Allows an application to revoke its access to an athlete’s data. This will invalidate all access tokens associated with the ‘athlete,application’ pair used to create the token. The application will be removed from the Athlete Settings page on Strava. All requests made using invalidated tokens will receive a 401 Unauthorized response.

Parameters

access_token: string required

Responds with the access token submitted with the request.

[61] OAuth 2.0 Authentication | Viadeo API ( 版) http://dev.viadeo.com/documentation/authentication/oauth-authentication/

In order to revoke a token (i.e. remove the bridge between your application and Viadeo) use  https://secure.viadeo.com/oauth-provider/revoke_access_token2 with access token as parameter

https://secure.viadeo.com/oauth-provider/revoke_access_token2?

client_id=<YOUR_API_KEY>&

client_secret=<YOUR_API_SECRET>&

redirect_uri=http://www.example.com/oauth_redirect&

access_token=<ACCESS_TOKEN_TO_REVOKE>

 

In response, you will get the following json response:

{"token_revoked"}

[62] Strava Developers () https://developers.strava.com/docs/authentication/#deauthorization

Applications can revoke access to an athlete’s data. This will invalidate all refresh tokens and access tokens that the application has for the athlete, and the application will be removed from the athlete’s apps settings page. All requests made using invalidated tokens will receive a 401 Unauthorized response.

The endpoint is POST https://www.strava.com/oauth/deauthorize.

access_token required string, in query Responds with the refresh tokens that were revoked.