WebAPI共通情報
WebAPI共通情報
- APIは全てHTTPS通信でアクセスします。
- 全てのAPIは、
https://fss-app.yubion.com/api/
以下に対してAPI名をパスとして指定する事で呼び出します。 - HTTPメソッドは全て
POST
でリクエストを行います。 getNonce
を除いた全てのAPIは、後述する共通HTTPヘッダの設定とヘッダでの認証情報の送付が必須となります。- APIパラメータの送信・リクエスト結果の受信は全てJSON形式で行われます。
- 一部の連続して処理される必要があるリクエスト(FIDO認証の登録・認証処理)はCookieの保持が必要になります。
APIリクエスト時共通HTTPヘッダ
ヘッダ名 | 内容 |
---|---|
X-Fss-Rp-Id | 処理を行うRPのRP ID |
X-Fss-Api-Auth-Id | 認証に用いるAPIキーID |
X-Fss-Auth-Body-Hash | (Nonce署名認証・日付署名認証)署名に用いるリクエストボディ部のSHA-256ハッシュ値をBase64Urlエンコードした文字列 |
X-Fss-Auth-Signature | (Nonce署名認証・日付署名認証)署名結果のバイト列(Raw/P1363 Format)をBase64Urlエンコードした文字列 |
X-Fss-Auth-Nonce | (Nonce署名認証)getNonceで取得したNonce値 |
X-Fss-Auth-Request-Time | (日付署名認証)署名日時をISO8601形式で表した文字列 |
X-Fss-Auth-Access-Key | (アクセスキー認証)アクセスキー |
情報
APIログには、User-Agentヘッダの内容と、X-Forwarded-ForヘッダまたはRemote-Addrヘッダの中で最初に出現した(よりリクエスト元に近い)グローバルIPアドレスが記録されます。
API認証方法
API認証方法は3種類の方法を提供しています。
種別 | 説明 |
---|---|
Nonce署名認証 | FIDO2ServerServiceが提供するNonce(ランダム値)を使用して署名を作成し、検証を行います。セキュリティレベルが一番高い方式です。APIリクエストごとに、Nonce値取得の通信が別途行われます。 |
日付署名認証 | 日時を使用して署名を作成し、検証を行います。Nonce署名認証と比較すると、理論上では通信盗聴による短時間内でのリプレイ攻撃の可能性が発生しますが、十分にセキュリティレベルが高い方式です。利用者が非常に多いサービスなどでFIDO2ServerServiceへの通信による各種オーバーヘッドを抑えたい場合に利用をお勧めします。 |
アクセスキー認証 | 固定のキーを使用し、キーが一致するかどうかの検証を行います。シンプルな方式です。 |
情報
APIキーの発行方法についてはこちらをご確認ください。
署名認証(Nonce署名認証・日付署名認証)
シークレットキーが署名作成用の秘密鍵情報(ECDSA P-256、pkcs8形式の秘密鍵情報をBase64Urlエンコードしたもの)となっています。
その秘密鍵を用いて、以下の連結されたバイト列に対して署名を行います。
[ 認証形式ごとの署名対象データ ] || [ リクエストボディのSHA-256ハッシュ値 ]
-
「認証形式ごとの署名対象データ」は、以下のUTF-8文字列のバイト列です。
- Nonce署名認証
getNonceリクエストで取得したNonce文字列。この文字列をリクエストヘッダの「X-Fss-Auth-Nonce」に指定する必要があります。以下のような場合、API認証に失敗します。- FSSサーバーが発行していないNonce文字列を用いた場合
- 既に使用したNonce文字列を用いた場合
- 発効後、一定期間が経過したNonce文字列を用いた場合
- 日付署名認証
現在日時をISO8601形式で表した文字列。この文字列をリクエストヘッダの「X-Fss-Auth-Request-Time」に指定する必要があります。FSSサーバーの時刻と30秒以上の差がある場合、API認証に失敗します。
- Nonce署名認証
-
「リクエストボディのSHA-256ハッシュ値」は、リクエストボディのSHA-256ハッシュのバイト列です。リクエストヘッダの「X-Fss-Auth-Body-Hash」に、ハッシュ値をBase64Urlエンコードした文字列を指定する必要があります。
-
署名結果は、RとSを連結した64byteのRaw Format(P1363 Format)で出力し、それをBase64Urlエンコードした文字列をリクエストヘッダの「X-Fss-Auth-Signature」に指定します。
情報
ECDSA形式の署名は、ライブラリ実装によってはASN.1 DER formatで出力されるものがあります。その場合、Raw Format形式への変換が必要となります。
アクセスキー認証
- 発行されたシークレットキーをそのままリクエストヘッダの「X-Fss-Auth-Access-Key」に指定します。
警告
いずれの認証方法を用いる場合でも、シークレットキーはアプリケーションサーバー外に持ち出されないように取り扱う必要があります。また、公開リポジトリでソース管理をする場合などは、リポジトリ上でシークレットキーが公開されないようにご注意ください。
API応答基本形式
全てのAPI応答の基本的な形式を解説します。
{
appStatus : "OK",
data : {
...
},
message : "...",
appSubStatus : {
...
},
}
キー | 型 | 内容 |
---|---|---|
appStatus | ApplicationResultStatus | 実行結果。正常動作時は"OK"、異常時はエラーを示す文字列が設定される。(後述) |
data | any | API実行結果。エラー時はnullとなる。 |
message | string | null | メッセージ。エラー発生時に補足メッセージが格納される。 |
appSubStatus | any | null | 実行結果付帯情報。エラー内容によっては追加の情報が格納される。 |
API実行結果情報(ApplicationResultStatus)
ApplicationResultStatus
は以下の値を取ります。
値 | 内容 |
---|---|
“OK” | 正常 |
“UNEXPECTED_ERROR” | 不明エラー |
“COMMUNICATION_FAILED” | 通信エラー |
“BAD_JSON_FORMAT” | 引数エラーの一種。JSONとして正しく解釈できない場合に用いる。 |
“PARAMETER_ERROR” | 引数・パラメータエラー |
“INSERT_ERROR” | 挿入失敗 |
“UPDATE_ERROR” | 更新失敗 |
“DELETE_ERROR” | 削除失敗 |
“PROCESS_ERROR” | その他処理失敗 |
“DUPLICATED” | 重複エラー(ID以外の重複を許さないパラメータに対するエラー。userNameの重複を許可していないRPでuserNameが重複した場合など) |
“NOT_FOUND” | 非存在エラー |
“ALREADY_EXISTS” | 登録済みエラー(IDの重複) |
“AUTHENTICATION_FAILED” | 認証失敗 |
“UNAUTHORIZED” | セッション無効 |
“PERMISSION_ERROR” | 権限エラー |
“ACTIVATION_ERROR” | アクティベーションエラー |
“LICENSE_ERROR” | ライセンスエラー |
FIDO認証登録・認証処理時の詳細エラー情報
FIDO認証の登録・認証処理(registerCredential/xxx、authenticate/xxx)でエラーが発生した際は、appSubStatus内にerrorCode
プロパティが設定される事があります。
{
appStatus : "PARAMETER_ERROR",
message : "...",
appSubStatus : {
errorCode : "",
...
},
}
このerrorCode
は以下の値を取ります。
値 | 内容 |
---|---|
“USER_NOT_FOUND” | ユーザーが存在しない |
“REQUIRE_USER_NAME” | ユーザー名の指定が必要 |
“REQUIRE_USER_ID_OR_USER_HANDLE” | ユーザーIDの指定かUserHandleの指定が必要 |
“USER_IS_DISABLED” | ユーザーが無効状態 |
“USER_HANDLE_NOT_MATCH” | UserHandleが想定した値ではない |
“CREDENTIAL_NOT_FOUND” | クレデンシャルが存在しない |
“REQUIRE_CREDENTIAL_ID” | クレデンシャルIDの指定が必要 |
“CREDENTIAL_IS_DISABLED” | クレデンシャルが無効状態 |
“CREDENTIAL_ID_MISMATCH” | クレデンシャルIDが想定した値ではない |
“BAD_CREDENTIAL_TYPE” | クレデンシャル種別不正 |
“CREDENTIAL_ALREADY_REGISTERED” | クレデンシャルが既に存在する |
“CLIENT_DATA_JSON_PARSE_FAILED” | ClientDataJSONのJSONパースに失敗した |
“REQUIRE_ATTESTED_CREDENTIAL_DATA” | (登録時)AttestedCredentialDataが存在しない |
“BAD_REQUEST_TYPE” | リクエスト種別が不正 |
“RP_NOT_FOUND” | RPが存在しない |
“RP_ID_HASH_MISMATCH” | rpIdHashがRP IDのハッシュと合致しない |
“ORIGIN_NOT_ALLOWED” | Originが許可されていない |
“REQUIRE_USER_VERIFICATION” | UserVerificationが必須(開始時にUserVerificationが必須である指定をした場合) |
“LICENSE_LIMIT_EXCEEDED” | ライセンス上限エラー |
“CREATE_RESPONSE_NOT_FOUND” | 登録応答プロパティが存在しない |
“REQUEST_RESPONSE_NOT_FOUND” | 認証応答プロパティが存在しない |
“ATTESTATION_RESPONSE_NOT_FOUND” | AttestationResponseが存在しない |
“ATTESTATION_RESPONSE_PARSE_FAILED” | AttestationResponseの解釈に失敗 |
“INTERNAL_ERROR” | 内部エラー |
“UNEXPECTED_ERROR” | 不明エラー |
“INVALID_SESSION” | 無効セッション |