[11] [DFN[[RUBYB[一時]@en[temporary]]credentials]]は、 [[OAuth 1.0]]
の[[認可]]の過程において[[クライアント]]からのアクセス要求を識別するものです。
[DFN[[RUBYB[一時]@en[temporary]]credentials[RUBYB[要求]@en[request]]]]は、
[[クライアント]]が[[鯖]]から[[一時credentials]]を取得するための
[[HTTP要求]]です。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2014-12-28 14:19:21 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-1.1>
- [3] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2014-12-28 14:19:21 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-2>
-- [10] [CITE@en[RFC 5849 - The OAuth 1.0 Protocol]] ([TIME[2014-12-28 14:19:21 +09:00]] 版) <http://tools.ietf.org/html/rfc5849#section-2.1>
- [34] [CITE@en[Final: OAuth Request Body Hash]] ([TIME[2009-04-12 08:08:27 +09:00]] 版) <http://oauth.googlecode.com/svn&l=52/spec/ext/body_hash/1.0/oauth-bodyhash.html#when_to_include>
]REFS]

* 用語

[2] [[temporary credentials]] のことを元は [DFN[[[request token]]]] および [DFN[[[request token secret]]]]
と呼んでいました [SRC[>>1]]。

* 一時 credentials

[5] [[temporary credentials]] は、[[認可]]の間[[クライアント]]からのアクセス要求を識別するために使います [SRC[>>3]]。
[[temporary credentials]] は、[RUBYB[[[識別子]]]@en[identifier]]と[RUBYB[[[共有秘密]]]@en[shared-secret]]の2つの値の組によって表されます。

;; [24] 2つの値の[[値域]]や長さは、仕様上は制限がありません。多くの場合は十数文字程度の
[[ASCII文字]]で、あまり[[記号]]は含まない方が安全です。 (しかし[[クライアント]]は任意の値を受け入れる必要があります。)

[4] [[temporary credentials]] は、[[temporary credentials要求]]によって[[鯖]]から[[クライアント]]に発行されます。

[6] [[temporary credentials]] は、[[資源所有者認可]]において[[アクセス要求]]を識別するために使います。

[7] [[temporary credentials]] は、[[トークン要求]]において[[クライアント]]が[[鯖]]から[[token credentials]]を得るために使います。

[8] [[鯖]]は、[[token credentials]]を得るために [[temporary credentials]]
が使われた後、[[temporary credentials]] を取り消し ([[revoke]]) しなければ[['''なりません''']]
[SRC[>>3]]。

[9] [[temporary credentials]] の[[寿命]]は限定する[['''べきです''']] [SRC[>>3]]。

* 一時 credentials 要求

[12] [[クライアント]]は、
[DFN[[RUBYB[一時credentials要求]@en[temporary credentials request]]]]によって[[鯖]]から[[一時credentials]]を得ることができます。

[14] [[クライアント]]は、[[鯖]]から何らかの方法で[[広告]]された[[エンドポイント]]の
[[URL]] を[[要求URL]]として使います [SRC[>>10]]。

;; 以降で示す通り、[[引数]]が追加されることもあります。

[18] [[鯖]]は[[保安通信路]]を使うことを要求しなければ[['''なりません''']] [SRC[>>10]]。

;; [19] [[HTTP応答]]に[[平文]]の [[credentials]] が含まれることになるからです [SRC[>>10]]。

[13] [[クライアント]]は、[[要求メソッド]]として [CODE(HTTP)@en[[[POST]]]]
を使います。 [SRC[>>10]]

[25] [[一時credentials要求]]は、[[認証された要求]]です [SRC[>>10]]。

[15] [[クライアント]]は [CODE(HTTP)@en[[[oauth_callback]]]]
[[引数]]を指定しなければ[['''なりません''']] [SRC[>>10]]。

[35] [[クライアント]]は [CODE(HTTP)@en[[[oauth_body_hash]]]]
[[引数]]を指定する[['''べきではありません''']] [SRC[>>34]]。

[17] [[クライアント]]は、[[クライアントcredentials]]のみ使って[[認証]]します。
[[トークンcredentials]]は使いません。
空の [CODE(HTTP)@en[[[oauth_token]]]] [[引数]]は省略しても構いません。
[[token secret]] の値は[[空文字列]]としなければ[['''なりません''']]。 [SRC[>>10]]

;; [18] [CODE[[[oauth_token]]]] は空文字列または省略のどちらでも良いようですが、
仕様上不明瞭であり、省略しか認めないサーバーもあるようです。 [TIME[2013-09-14T08:14:47.00Z]]

[16] [[鯖]]はその他の[[引数]]を求めても構いません。 [SRC[>>10]]

[EG[
[29] [[Twitter]] [[xAuth]] は [CODE(URI)@en[[[x_auth_access_type]]]]
[[引数]]を規定しています [SRC[>>28]]。

[26] [[Google]] は [CODE(URI)@en[[[scope]]]] [[引数]]を必須、
[CODE(URI)@en[[[xoauth_displayname]]]] [[引数]]を省略可能としていました [SRC[>>27]]。

[33] [[はてな]]は [CODE(URI)@en[[[scope]]]] [[引数]]を必須としています [SRC[>>32]]。

;; [30] なおこれらは [CODE(URI)@en[oauth_]] から始まりませんから、
[CODE(HTTP)@en[[[Authorization:]]]] [[ヘッダー]]には指定できません。

[REFS[
- [28] [CITE[POST oauth/request_token | Twitter Developers]] ([TIME[2015-03-05 11:36:43 +09:00]] 版) <https://dev.twitter.com/oauth/reference/post/oauth/request_token>
- [27] [CITE@ja[OAuth 1.0 API Reference - Google Accounts Authentication and Authorization — Google Developers]] ([TIME[2014-12-05 11:52:26 +09:00]] 版) <https://developers.google.com/accounts/docs/OAuth_ref#Parameters>
- [32] [CITE[Consumer key を取得して OAuth 開発をはじめよう - Hatena Developer Center]] ([TIME[2015-03-05 15:23:31 +09:00]] 版) <http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/consumer#token>
]REFS]
]EG]

[20] [[鯖]]は[[要求]]を[RUBYB[検証]@en[verify]]し、
[[妥当]]であるなら[[一時credentials]] ([[識別子]]と[[共有秘密]])
を[[応答]]しなければ[['''なりません''']] [SRC[>>10]]。

[21] [[一時credentials]]を送る場合、[[状態符号]]は [CODE(HTTP)[[[200]]]] で、
[[MIME型]]は [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]] とします [SRC[>>10]]。
そこには、次の[[引数]]を含めなければ[['''なりません''']] [SRC[>>10]]。
[FIG(list members)[
[FIGCAPTION[
[[payload body]] ([CODE(MIME)@en[[[application/x-www-form-urlencoded]]]])
]FIGCAPTION]
:[CODE(HTTP)@en[[[oauth_token]]]]:[[一時credentials]]の[RUBYB[[[識別子]]]@en[identifier]]とします。
:[CODE(HTTP)@en[[[oauth_token_secret]]]]:[[一時credentials]]の[RUBYB[[[共有秘密]]]@en[shared-secret]]とします。
:[CODE(HTTP)@en[[[oauth_callback_confirmed]]]]:[CODE(HTTP)@en[[[true]]]]
とします。
]FIG]

;; [22] [CODE(HTTP)@en[[[oauth_callback_confirmed]]]] は、 [[OAuth 1.0]] 
の最初の版と区別するためのものです。

;; [23] [[RFC 5849]] には、「[CODE[token]] と名前に含まれるが[[トークン]]ではない」
との注記があります。元々「[[要求トークン]]」と呼ばれていた (>>2) のに [[IETF]]
が後から用語だけ変えてしまったせいでおかしなことになっています。

;; [195] [[Twitter]] の[[鯖]]は [CODE(MIME)@en[[[application/x-www-form-urlencoded]]]]
を使いながらも、 [CODE(HTTP)@en[[[Content-Type:]]]] には [CODE(MIME)@en[[[text/html]]]]
を指定します。このため[[クライアント]]は [CODE(HTTP)@en[[[Content-Type:]]]]
[[ヘッダー]]を無視しなければなりません。 [TIME[2013-09-14T08:16:00.100Z]]

[31] [[OAuth 1.0]] 本体仕様としてはエラー時の応答については規定していません。
[[OAuth Problem Reporting Extension]] は報告方法を規定しており、
実装によってはこれに対応しています。

* 歴史

[36] [[OAuth 2.0]] では[[一時credentials]]に相当するものはなくなっています。