シグネチャーによる認証
Rapid の署名認証メソッドは、すべての API リクエストに必須です。
API キーの認証とアクセス
HTTP 認証ヘッダーを使用して各リクエストの API キーと SHA-512 シグネチャーハッシュを送信します。シグネチャーハッシュは API キー、共有秘密、UNIX タイムスタンプからなります。
API キーをお持ちでない場合アカウントの設定に関する情報と手順については「利用を開始する」ページをご覧ください。
認証ヘッダーを作成する
Rapid では認証ヘッダーに次のフォーマットを使用する必要があります。先頭に EAN
が必要です。このプレフィックスによって、正しい認証ルールがリクエストに適用されます。
Authorization: EAN APIKey=yourAPIKey,Signature=sha512Hash,timestamp=yourUNIXTimestamp
signature
値は、API キー + 共有秘密 + UNIX タイムスタンプ (秒) を連結したソルトのない SHA-512 ハッシュです。
timestamp
値は、signature
の生成に使用されたものと同じ****値でなければなりません。 異なるタイムスタンプを使用した場合、Rapid はお使いのシグネチャーハッシュ値を認証できず、リクエストは拒否されます。
完全な認証ヘッダーの例を次に示します。
Authorization: EAN APIKey=dkc4wrkp7w58wx5v2jxen2kx,Signature=Mgup2Azf,timestamp=1476739212
認証ヘッダーを確認する
テストリクエストを試行する前に、Rapid シグネチャー ジェネレーターでご自身のコードをテストしてください。
注意 : NTP クロック同期
Rapid は Network Time Protocol (NTP) を使用して内部サーバー時間を同期します。ご自身のサイトでも NTP を使用している場合は、時刻同期の問題は起きません。最近のほとんどのオペレーティング システムでは、この時刻同期サービスまたは同様のサービスをサポートしています。ご使用のオペレーティング システム資料をご確認ください。ある程度の時間差に対応するため、システムはサーバーのタイムスタンプの前後 5 分までのタイムスタンプを受け付けます。
シグネチャー生成コードの例
PHP
$apiKey = "abcdefg";
$secret = "1a2bc3";
$timestamp = time();
$authHeader = 'Authorization: EAN APIKey=' . $apiKey . ',Signature=' . hash("sha512", $apiKey.$secret.$timestamp) . ',timestamp=' . time();
JavaScript
var crypto = require('crypto');
var request = require('request');
var apiKey = '123';
var secret = '123';
var timestamp = Math.round(new Date().getTime() / 1000);
var hash = crypto.createHash('sha512').update(apiKey + secret + timestamp).digest('hex');
var authHeaderValue = 'EAN APIKey=' + apiKey + ',Signature=' + hash + ',timestamp=' + timestamp;
Java
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Timestamp;
import java.util.Date;
String apiKey = "123";
String secret = "123";
Date date= new java.util.Date();
Long timestamp = (date.getTime() / 1000);
String signature = null;
try {
String toBeHashed = apiKey + secret + timestamp;
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte[] bytes = md.digest(toBeHashed.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++){
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}
signature = sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String authHeaderValue = "EAN APIKey=" + apiKey + ",Signature=" + signature + ",timestamp=" + timestamp;
Python
#!/usr/bin/env python
import hashlib
import time
apiKey = "123"
secret = "123"
timestamp = str(int(time.time()));
authHeaderValue = "EAN APIKey=" + apiKey + ",Signature=" + hashlib.sha512(apiKey+secret+timestamp).hexdigest() + ",timestamp=" + timestamp
Ruby
require 'digest'
apiKey="123"
secret="123"
timestamp = Time.now.to_i
toBeHashed = "#{apiKey}#{secret}#{timestamp}"
signature = Digest::SHA2.new(512).hexdigest(toBeHashed)
authHeaderValue = "EAN APIKey=#{apiKey},Signature=#{signature},timestamp=#{timestamp}"
C#
String apiKey = "123";
String secret = "123";
TimeSpan epochTicks = new TimeSpan(new DateTime(1970, 1, 1).Ticks);
TimeSpan unixTicks = new TimeSpan(DateTime.UtcNow.Ticks) - epochTicks;
double unixTime = (int)unixTicks.TotalSeconds;
var toBeHashed = apiKey + secret + unixTime;
var bytes = System.Text.Encoding.UTF8.GetBytes(toBeHashed);
using (var hash = System.Security.Cryptography.SHA512.Create())
{
var hashedInputBytes = hash.ComputeHash(bytes);
var hashedInputStringBuilder = new System.Text.StringBuilder(128);
foreach (var b in hashedInputBytes)
hashedInputStringBuilder.Append(b.ToString("X2"));
var signature = hashedInputStringBuilder.ToString();
var authHeaderValue = "EAN APIKey=" + apiKey + ",Signature=" + signature +",timestamp=" + unixTime;
}
Perl
use strict;
use Crypt::Digest::SHA512 qw(sha512_hex);
my $apiKey = '123';
my $secret = '123';
my $timestamp = time;
my $sig = sha512_hex($apiKey . $secret . $timestamp);
my $authHeaderValue = "EAN APIKey=".$apiKey.",Signature=".$sig.",timestamp=".$timestamp;
print $authHeaderValue;
GoLang
apiKey := "123"
secret := "123"
timestamp := strconv.FormatInt(time.Now().Unix(), 10)
c := sha512.New()
c.Write([]byte(apiKey + secret + timestamp))
signature := hex.EncodeToString(c.Sum(nil))
authHeaderValue := "EAN APIKey=" + apiKey + ",Signature=" + signature + ",timestamp=" + timestamp
共有秘密を保護する
提供された共有秘密はリクエストデータのセキュリティ上非常に重要で、パスワードと同様に扱う必要があります。一般にアクセス可能なサイトやアプリコードの値をそのまま使用することは避けてください。Rapid の統合が許可されると、共有秘密と API キーが提供されます。