احراز هویت و API Key
نکات مهم
هشدار امنیتی
- جهت کار با وب سرویس های مربوط به حساب کاربری، استفاده از API Key الزامی است
- جهت ایجاد هر API Key به دلایل مسائل امنیتی وارد کردن حداقل یک IP آدرس الزامیست
- هرگز API Key حساب کاربری خود را با دیگران به اشتراک نگذارید
برای دریافت API Key به این صفحه مراجعه کنید.
برای استفاده از API های دارای امضا، نیازمند API KEY و SECRET میباشید که در بخش حساب کاربری میتوانید ایجاد نمایید. در Header های این درخواست ها باید کلید های مقابل اضافه شود.
امضاء درخواست ها
برای امضاء درخواست ها ابتدا باید تمام مشخصات درخواست را مشابه زیر در یک متن آماده کنید:
<method>\n<full_path>\n<timestamp>\n<data>
| عنوان | توضیحات |
|---|---|
| method | متد استفاده شده در زمان ارسال درخواست |
| full_path | مسیر درخواست داده شده به همراه آرگومان ها و بدون دامنه سایت |
| timestamp | تایم استمپ حال حاضر با منطقه زمانی UTC به میلی ثانیه |
| data | داده های json ارسالی در صورت وجود رمزنگاری شده به صورت base64 |
نکته
در صورت عدم وجود data باید متن را مشابه زیر درست کرد: <method>\n<full_path>\n<timestamp>
نمونه کد
- Python
- JavaScript
- Go
import hmac
import hashlib
import datetime
import json
import base64
def create_signature(secret_key, full_path, request_method, request_data=None):
timestamp = int(datetime.datetime.utcnow().timestamp() * 1000)
msg = f'{request_method.upper()}\n{full_path}\n{timestamp}'
if request_data:
base64encode = base64.b64encode(json.dumps(request_data).encode()).decode()
msg += f'\n{base64encode}'
signed_key = hmac.new(
bytes(secret_key, "utf-8"),
msg=bytes(msg, "utf-8"),
digestmod=hashlib.sha256).hexdigest()
return signed_key, timestamp
# مثال استفاده
api_secret = "your-secret-key"
path = "/api/v1/test?example=sample"
method = "POST"
data = {"example": "sample"}
signature, timestamp = create_signature(api_secret, path, method, data)
print(f"Signature: {signature}")
print(f"Timestamp: {timestamp}")
const crypto = require('crypto');
const moment = require('moment');
function createSignature(secretKey, fullPath, requestMethod, requestData = null) {
const timestamp = moment().valueOf();
let msg = `${requestMethod.toUpperCase()}\n${fullPath}\n${timestamp}`;
if (requestData) {
const base64Encoded = Buffer.from(JSON.stringify(requestData)).toString('base64');
msg += `\n${base64Encoded}`;
}
const signedKey = crypto
.createHmac('sha256', secretKey)
.update(msg)
.digest('hex');
return [signedKey, timestamp];
}
// مثال استفاده
const apiSecret = "your-secret-key";
const path = "/api/v1/test?example=sample";
const method = "POST";
const data = { example: "sample" };
const [signature, timestamp] = createSignature(apiSecret, path, method, data);
console.log(`Signature: ${signature}`);
console.log(`Timestamp: ${timestamp}`);
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
"strings"
"time"
)
func createSignature(secretKey, fullPath, requestMethod string, requestData interface{}) (string, int64) {
timestamp := time.Now().UnixNano() / int64(time.Millisecond)
msg := fmt.Sprintf("%s\n%s\n%d", strings.ToUpper(requestMethod), fullPath, timestamp)
if requestData != nil {
jsonData, err := json.Marshal(requestData)
if err != nil {
panic(err)
}
base64Encoded := base64.StdEncoding.EncodeToString(jsonData)
msg += "\n" + base64Encoded
}
h := hmac.New(sha256.New, []byte(secretKey))
h.Write([]byte(msg))
signature := hex.EncodeToString(h.Sum(nil))
return signature, timestamp
}
func main() {
apiSecret := "your-secret-key"
path := "/api/v1/test?example=sample"
method := "POST"
data := map[string]interface{}{
"example": "sample",
}
signature, timestamp := createSignature(apiSecret, path, method, data)
fmt.Printf("Signature: %s\n", signature)
fmt.Printf("Timestamp: %d\n", timestamp)
}
مثال های عملی
با داده:
POST\n/api/v1/test?example=sample\n1689680240824\neyJleGFtcGxlIjoic2FtcGxlIn0=
بدون داده:
POST\n/api/v1/test?example=sample\n1689680240824
دستور OpenSSL:
echo -n "Your Generated Request Text" | openssl dgst -sha256 -hmac "Your SECRET key"