[3] [DFN[[CODE(URI)@en[[[error]]]]]] [[引数]]は、[[誤り符号]]を表します [SRC[>>1, >>19, >>20]]。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.1.2.1>
- [19] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-4.2.2.1>
- [20] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-5.2>
- [28] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-8.5>
- [13] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#section-11.4>
- [14] [CITE@en[RFC 6749 - The OAuth 2.0 Authorization Framework]] ([TIME[2014-12-15 14:15:35 +09:00]] 版) <http://tools.ietf.org/html/rfc6749#appendix-A.7>
- [16] [CITE[RFC Errata Report]] ([TIME[2015-02-16 00:47:02 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=6749>
- [17] [CITE@en[RFC 6750 - The OAuth 2.0 Authorization Framework: Bearer Token Usage]] ([TIME[2015-02-11 06:22:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6750#section-3>
- [33] [CITE@en[RFC 7009 - OAuth 2.0 Token Revocation]] ([TIME[2014-12-21 18:10:21 +09:00]] 版) <http://tools.ietf.org/html/rfc7009#section-2.2.1>
- [30] [CITE[OAuth Parameters]] ([TIME[2015-01-24 07:59:42 +09:00]] 版) <http://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml#extensions-error>
- [35] [CITE@en[Final: OpenID Connect Core 1.0 incorporating errata set 1]] ([TIME[2014-11-09 04:00:29 +09:00]] 版) <http://openid.net/specs/openid-connect-core-1_0.html#AuthError>
- [36] [CITE@en[Final: OpenID Connect Dynamic Client Registration 1.0 incorporating errata set 1]] ([TIME[2014-11-09 04:02:08 +09:00]] 版) <http://openid.net/specs/openid-connect-registration-1_0.html#RegistrationError>
- [37] [CITE@ja[Using OAuth 2.0 for Devices - Google Accounts Authentication and Authorization — Google Developers]] ([TIME[2014-12-16 06:48:15 +09:00]] 版) <https://developers.google.com/accounts/docs/OAuth2ForDevices>
- [38] [CITE@en[Authorization Endpoint Errors]] ([TIME[2015-03-05 10:46:04 +09:00]] 版) <https://msdn.microsoft.com/en-us/library/azure/dn645544.aspx>
- [39] [CITE@en[Token Issuance Endpoint Errors]] ([TIME[2015-03-05 10:47:08 +09:00]] 版) <https://msdn.microsoft.com/en-us/library/azure/dn645548.aspx>
- [40] [CITE@en[Errors from Secured Resources]] ([TIME[2015-03-05 10:50:36 +09:00]] 版) <https://msdn.microsoft.com/en-us/library/azure/dn645539.aspx>
- [43] [CITE@en[OAuth | GitHub API]] ([TIME[2015-03-05 18:02:01 +09:00]] 版) <https://developer.github.com/v3/oauth/#common-errors-for-the-authorization-request>
- [44] [CITE@en[RFC 7521 - Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants]] ([TIME[2015-05-28 13:43:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7521#section-4.1.1>
- [45] [CITE@en[RFC 7521 - Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants]] ([TIME[2015-05-28 13:43:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7521#section-4.2.1>
]REFS]

* 構文

[12] [CODE(char)[[[U+0020]]]] を含み、 [CODE(char)[[[U+0022]]]] と [CODE(char)[[[U+005C]]]]
を含まない[[印字可能ASCII文字]]しか含んでは[['''なりません''']] [SRC[>>1, >>19, >>20, >>22, >>13, >>14, >>17]]。
[[空文字列]]にはできません [SRC[>>14]]。

* 誤り符号の一覧

[4] [RUBYB[[[誤り符号]]]@en[error code]]は、次のいずれかとされています。
[FIG(list)[
:[5] [CODE(URI)@en[[[invalid_request]]]]:
必須の[[引数]]が指定されなかった [SRC[>>1, >>19, >>20, >>17, >>33]] か、
[[非妥当]]な[[引数]]値が指定された [SRC[>>1, >>19, >>20, >>17, >>33]] か、
[[引数]]が複数回指定された [SRC[>>1, >>19, >>20, >>17, >>33]] か、
[[アクセストークン]]が複数の方法で指定された [SRC[>>17]] か、
その他不正があった [SRC[>>1, >>19, >>20, >>17, >>33]] ことを表します。 
[[状態符号]] [CODE(HTTP)[[[400]]]] を使う[['''べき''']]です [SRC[>>17]]。
:[21] [CODE(URI)@en[[[invalid_client]]]]:
[[クライアント認証]]が失敗したことを表します。
([[状態符号]] [CODE(HTTP)[[[401]]]] を使うことができます。[[トークンエンドポイント]]参照。)
[SRC[>>20, >>33]]
[CODE(HTTP)[[[400]]]] を使った例 [SRC[>>45]] も示されています。
:[22] [CODE(URI)@en[[[invalid_grant]]]]:
指定された[[認可承諾]] ([[認可符号]]や[[資源所有者credentials]]など) や[[更新トークン]]が[[非妥当]]、
[[満期]]、
取り消し ([[revoke]]) 済み、
[[リダイレクトURL]]が一致しない、
あるいは他の[[クライアント]]に向けたものであることを表します。 [SRC[>>20, >>33]]
[[assertion]] が非妥当な時にも使います [SRC[>>44]]。
:[26] [CODE(URI)@en[[[invalid_token]]]]:
指定された[[アクセストークン]]が[[満期]]している、取り消し ([[revoke]]) されている、
不正である、あるいはその他非妥当であることを表します [SRC[>>17]]。
[[状態符号]] [CODE(HTTP)[[[401]]]] を使う[['''べきです''']] [SRC[>>17]]。
[[クライアント]]は新しい[[アクセストークン]]を使って再試行して構いません [SRC[>>17]]。
:[6] [CODE(URI)@en[[[unauthorized_client]]]]:
[[クライアント]]が[[認可符号]]または[[アクセストークン]]を要求することを[[認可]]されていない [SRC[>>1, >>19]]、
あるいは当該[[承諾型]]を使うことを認められていない [SRC[>>20, >>33]] ことを表します。
:[23] [CODE(URI)@en[[[unsupported_grant_type]]]]:
[[認可鯖]]が指定された[[承諾型]]に対応していないことを表します [SRC[>>20, >>33]]。
:[7] [CODE(URI)@en[[[access_denied]]]]:
[[資源所有者]]または[[認可鯖]]が要求を拒絶したことを表します。 [SRC[>>1, >>19]]
:[8] [CODE(URI)@en[[[unsupported_response_type]]]]:
[[認可鯖]]が[[認可符号]]または[[アクセストークン]]の取得に対応していないことを表します。 [SRC[>>1, >>19]]
:[34] [CODE(URI)@en[[[unsupported_token_type]]]]:
指定された[[トークン]]の種別の [[revoke]] に対応していないことを表します [SRC[>>33]]。
:[9] [CODE(URI)@en[[[invalid_scope]]]]:
要求された[[適用範囲]]が[[非妥当]]か、未知か、不正であることを表します。 [SRC[>>1, >>19, >>20, >>33]]
:[27] [CODE(URI)@en[[[insufficient_scope]]]]:
[[要求]]には[[アクセストークン]]が有するより高い[[特権]]が必要であることを表します。
[[状態符号]] [CODE(HTTP)[[[403]]]] を使う[['''べきです''']]。
[CODE(HTTP)@en[[[scope]]]] [[引数]]を含めて構いません。 [SRC[>>17]]
:[10] [CODE(URI)@en[[[server_error]]]]:
[[認可鯖]]が未知の状況により要求を満足できないことを表します。 [[HTTP]] [CODE(HTTP)[[[500]]]]
[[状態符号]]に相当します。 [SRC[>>1, >>19]]
:[11] [CODE(URI)@en[[[temporarily_unavailable]]]]:
[[認可鯖]]が一時的な過負荷やメンテナンスのため要求を処理できないことを表します。 [[HTTP]]
[CODE(HTTP)[[[503]]]] [[状態符号]]に相当します。 [SRC[>>1, >>19]]
:[CODE[[[interaction_required]]]]:[SRC[>>35, >>39]]
:[CODE[[[login_required]]]]:[SRC[>>35]]
:[CODE[[[account_selection_required]]]]:[SRC[>>35]]
:[CODE[[[consent_required]]]]:[SRC[>>35]]
:[CODE[[[invalid_request_uri]]]]:[SRC[>>35, >>36]]
:[CODE[[[invalid_request_object]]]]:[SRC[>>35]]
:[CODE[[[request_not_supported]]]]:[SRC[>>35]]
:[CODE[[[request_uri_not_supported]]]]:[SRC[>>35]]
:[CODE[[[registration_not_supported]]]]:[SRC[>>35]]
:[CODE[[[invalid_client_metadata]]]]:[SRC[>>36]]
:[CODE[[[authorization_pending]]]]:[SRC[>>37]]
:[CODE[[[slow_down]]]]:[SRC[>>37]]
:[CODE[[[invalid_resource]]]]:[SRC[>>38, >>39, >>40]]
:[CODE[[[insufficient_access]]]]:[SRC[>>40]]
:[CODE[[[application_suspended]]]]:[SRC[>>43]]
:[CODE[[[redirect_uri_mismatch]]]]:[SRC[>>43]]
:[CODE[[[incorrect_client_credentials]]]]:[SRC[>>43]]
:[CODE[[[bad_verification_code]]]]:[SRC[>>43]]
]FIG]

[29] [[OAuth]] の拡張は追加の[[誤り符号]]を定義できます。
登録された[[アクセストークン型]]、[[引数 (OAuth 2.0)]]、[[承諾型]]が使う拡張の[[誤り符号]]は、
[[IANA登録簿]] [SRC[>>30]] に登録 [SRC[>>13]] しなければ[['''なりません''']]。
未登録の拡張の[[誤り符号]]も登録できます。
[[誤り符号]]はできるだけ拡張機能の名前で [CODE[example_invalid]]
のように修飾する[['''べきです''']]。 [SRC[>>28]] 

;; [31] なぜか他の[[引数]]とは違って、 [[RFC]] で規定されている[[誤り符号]]は
[[IANA登録簿]]に含まれておらず、拡張のみ登録する形となっています。
ただし [[RFC]] で規定されている[[誤り符号]]と同名のものが拡張で使われる時、
そちらを出典に [[IANA登録簿]]に登録されるようです。 (なんでそんな中途半端なことを...)

[42] [[ヤマレコ]]は、 [CODE[0]] (エラーなし) または [CODE[1]] (エラーあり)
を使います [SRC[>>41]]。

[REFS[
- [41] [CITE[1. OAuth認証 - ヤマレコ Web API]] ([TIME[2015-02-25 16:41:06 +09:00]] 版) <https://sites.google.com/site/apiforyamareco/api/oauth>
]REFS]

* 文脈

[2] [[認可エンドポイント]]からの[[リダイレクト]]によって[[誤り]]を通知する場合、
[CODE(URI)@en[[[error]]]] [[引数]]を指定しなければなりません。
[SRC[>>1, >>19]]

;; [[URL query]] に指定する場合 [SRC[>>1]] と[[素片識別子]]に指定する場合 [SRC[>>19]]
があります。

[24] [[トークンエンドポイント]]や [[revokeエンドポイント]]からの [[JSON]] [[応答]]によって[[誤り]]を通知する場合、
[CODE(URI)@en[[[error]]]] [[引数]]を指定しなければなりません。
[SRC[>>20, >>33]]

[25] [[アクセストークン]]を指定するために使う [CODE(ABNF)@en[[[auth-scheme]]]] は、
[[誤り]]の報告に [CODE(URI)@en[[[error]]]] [[引数]]を使うことができます。

;; [[資源鯖]]参照。

[18] [[資源鯖]]は、[[資源鯖]]への要求が[[アクセストークン]]を含んでいて、
[[認証]]に失敗した場合、 [CODE(HTTP)@en[[[error]]]] [[引数]]を
[CODE(HTTP)@en[[[WWW-Authenticate:]] [[Bearer]]]] に含める[['''べきです''']] [SRC[>>17]]。

[32] ただし[[クライアント]]が[[認証]]に必要な情報を[[要求]]に含めていない場合
([[アクセストークン]]が含まれていない場合や未対応の[[認証方式]]の場合など) は、
[CODE(URI)@en[[[error]]]] その他の[[誤り]]に関する情報を含める[['''べきではありません''']]
[SRC[>>17]]。

* 関連

[15] 併用する[[引数]]として [CODE(URI)@en[[[error_description]]]],
[CODE(URI)@en[[[error_uri]]]] があります。

[FIG(quote)[
[FIGCAPTION[
[46] [CITE@ja[Manually Build a Login Flow - Facebook Login]]
([TIME[2016-03-03 14:20:02 +09:00]] 版)
<https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow>
]FIGCAPTION]

> Cancelled login
> If people using your app don't accept the Login dialog and clicks Cancel, they'll be redirected to the following:
>  YOUR_REDIRECT_URI?
>   error_reason=user_denied
>   &error=access_denied
>   &error_description=The+user+denied+your+request.

]FIG]

[47] [CITE@en[Micropub]] ([TIME[2017-05-21 23:18:57 +09:00]]) <https://micropub.net/draft/#h-error-response>
