mixiアプリ » 技術仕様(RESTful API方式) » PC » RESTful API for PC » 2-legged OAuthによるAPIアクセス
2-legged OAuthによるAPIアクセス
mixiアプリにて利用可能なRESTful APIへアクセスするには、2-legged OAuthによる適切な署名が必要です。
RESTful APIへのアクセスに必要な情報
oauth_consumer_key | 事前に発行されたconsumer_keyを設定 |
oauth_nonce | ランダムな文字列。必ずリクエストごとに違う値を設定してください。 |
oauth_signature | APIリクエストの妥当性を検証するための署名で、生成方法については次項を参照ください。 |
oauth_signature_method | 署名方式。'HMAC-SHA1′固定 |
oauth_timestamp | UNIXタイムスタンプ。時刻がずれているとエラーになるので、サーバの時刻設定を確認ください。 |
oauth_version | 1.0 |
xoauth_requestor_id | (モバイル版アプリ)リクエストパラメータとして送られてくるopensocial_owner_idを設定 (PC版アプリ)ViewerのIDを設定 |
OAuth Signatureの生成方法
RESTful APIの利用に必要なOAuth Signatureの生成方法を以下に説明します。
Signature Methodは、現在、HMAC-SHA1のみ対応しています。
まず、署名生成に必要なベース文字列を生成するために次の値を用意します。
- HTTPリクエストメソッド(GETやPOSTなど)
- 実際にリクエストが送信されるAPI URL。クエリーパラメータは含めないようにします。
- OAuthの処理に必要な各種パラメータを設定します。クエリーパラメータはこちらに含めます。パラメータの順序は、予めパラメータ名のアルファベット順にソートしておく必要があります。
例えば、下記のような値を用意します。
- GET
- http://api-example.mixi.jp/people/@me/@self
- oauth_consumer_key=bc906fac81f581c3c96a&oauth_nonce=5c261539688b2a591aad&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1244636076&oauth_version=1.0&xoauth_requestor_id=xxxxxxxx
これらをURIエスケープした後に & で連結して、ベース文字列を生成します。
GET&http%3A%2F%2Fapi-example.mixi.jp%2Fpeople%2F%40me%2F%40self&oauth_consumer_key%3D bc906fac81f581c3c96a%26oauth_nonce%3D5c261539688b2a591aad%26oauth_signature_method %3DHMAC-SHA1%26oauth_timestamp%3D1244636076%26oauth_version%3D1.0%26xoauth_requestor_id %3Dxxxxxxxx
そして、このベース文字列をHMAC-SHA1によってダイジェスト値を生成し、BASE64でエンコードすることによってSignatureを生成します。この際、利用する共有キーはconsumer_secretと空のToken Secretを&で連結したものになります。consumer_secretはアプリケーション登録時に発行されたものを利用します。例えば、consumer_secretが79e0a55cde43e7dc86fd1e1366d6bd6ac7771db8なら79e0a55cde43e7dc86fd1e1366d6bd6ac7771db8&になります。こうして、シグニチャは以下のようになります。
B87FzgvghsEZzw/o44zlC/CIChk=
こうして生成されたパラメータをAuthorizationヘッダに追加して、APIリクエストを送信します。
GET http://api-example.mixi.jp/people/@me/@self?xoauth_requestor_id=xxxxxxxx Authorization: OAuth oauth_consumer_key="bc906fac81f581c3c96a", oauth_signature_method="HMAC-SHA1", oauth_signature="B87FzgvghsEZzw%2Fo44zlC%2FCIChk%3D", oauth_timestamp="1244636076", oauth_nonce="5c261539688b2a591aad", oauth_version="1.0"
上記のconsumer_key, consumer_secretはサンプルであり、実際のAPIアクセスには利用できません。また、consumer_secretについては、絶対に外部に漏らさないようにしてください。
より詳細な仕様については、OAuth Consumer Request 1.0 Draft 1を参照ください。
エラー発生の原因について
2-legged OAuthでのリクエストに関して、oauth_nonceやoauth_timestamp、署名の検証などに関してチェックが行われます。その結果エラーとして判断された際には、HTTPステータスコードとして400系や500系のコードが返却されることになります。また、WWW-Authenticateレスポンスヘッダ内のパラメーターによってエラーの種類と原因を特定できます。
エラーの種類と原因は、以下の仕様に従ってレスポンスに含まれることになります。
Extension: OAuth Problem Reporting
http://oauth.pbworks.com/ProblemReporting
具体的なエラーの記載は、例えば以下のようになります。
- oauth_nonceの重複が検出されたとき: oauth_problem=nonce_used
- oauth_timestampが不正だったとき: oauth_problem=timestamp_refused&oauth_acceptable_timestamps=(許容開始時刻)-(許容終了時刻)
参考文献
OAuth Consumer Request 1.0 Draft 1
http://oauth.googlecode.com/svn/spec/ext/consumer_request/1.0/drafts/1/spec.html
December 2007.
OAuth Problem Reporting http://oauth.pbworks.com/ProblemReporting