احرازهویت و ارتباط با سرویس

روش احرازهویت جهت ارتباط پایدار و امن

ارتباط احراز هویت درخواست کننده ها در سامانه ایرپلاس در دو مرحله انجام میشود

مرحله اول دریافت توکن اختصاصی و مدت دار که جهت رمزنگاری بسته ها و بازگشایی توسط هسته مرکزی استفاده میشود که در بخش “دریافت توکن ارتباطی (دستی و خودکار)” انجام میگردد.

مرحله دوم شامل تولید توکن JWT با استفاده از اطلاعات درخواست کننده و توکن دریافت شده در مرحله اول انجام میگردد که در بخش “ساخت توکن ارتباطی JWT

دریافت توکن ارتباطی (دستی و خودکار)

جهت دریافت توکن سازمانی شما از دو روش میتوانید اقدام نمائید.

روش اول: روش دستی – اخذ از طریق پنل کاربری

در این روش شما میتوانید با مراجعه به بخش میز مدیریتی > توکن اتصال و گزینه ساخت توکن اقدام به دریافت توکن نمائید.

توجه داشته باشید که توکن های دریافتی در بازه زمانی های 1 روزه، 1هفته، 15روزه، 1 ماهه و 3 ماهه عرضه میگردد که همراه با توکن تاریخ انقضأ آن درج خواهد شد شما در هر زمان میتوانید توکن خود را دوباره تولید نمائید و توکن قبلی را منقضی نمائید.


روش دوم: دریافت از طریق API

عنوان وضعیت مقادیر توضیحات
Method اجباری GET متد ارسال درخواست
Domain اجباری نام دامنه ثبت شده در اتوماسیون  
Api Url اجباری دامنه هسته مرکزی سرویس  
Api version اجباری به نسخه فعلی سرویس API تلقی میشود که در قسمت پیش نیازهای اتوماسیون به ریز شرح داده شده است.  

سربرگ – Header

روش دوم: دریافت از طریق API


در این روش شما باید درخواست خود را از طریق لینک زیر ارسال فرمائید.

{{Api Url}}/token

HEADER
GET /api/reservation/{{Api version}}/token HTTP/1.1
Host: {{Your Host}}
Content-Type: application/json
Domain: {{Your Domain}}

API Url از طریق پنل کاربری قابل مشاهده خواهد بود

پاسخ صحیح – Response True

عنوان نوع مقادیر توضیحات
payload Object    
payload.token String توکن دریافت شده یک توکن 64 کاراکتری می باشد
payload.expiration String زمان انقضأ توکن این زمان بر اساس الگو ISO8601
YYYY-MM-DDTHH:mm:ss.SSSZ
meta Object    
meta.timestamp Timestamp   زمان تولید پاسخ   این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود.

دریافت این پاسخ با Status Code 200 دریافت خواهد شد.

ISODateFormatDiagram.png

{
    "payload": {
        "token": "64 character token received",
        "expiration": "Expiration date and time - Gregorian calendar ISO8601"
    },
    "meta": {
        "timestamp": "Timestamp" // Timestamp
    }
}

پاسخ نادرست – Response False

عنوان نوع مقادیر توضیحات
error Object    
error.code Integer شماره خطا مربوطه جهت استعلام خطا میتوانید از طریق این لینک اقدام کنید.
meta Object    
meta.timestamp Timestamp   زمان تولید پاسخ   این زمان بر اساس timestamp می باشد – در صورت نیاز از این زمان استفاده شود.
{
  "error": {
    "code":"Error Code"
  },
  "meta": {
    "timestamp": "Timestamp" // Timestamp
  }
}

در صورت مشاهده Status Code 404 URL درخواست خود را به اشتباه وارد نموده اید.

ساخت توکن ارتباطی JWT

JWT در واقع یک توکن امنیتی است که بر پایه فرمت JSON ساخته شده است. این توکن حاوی اطلاعات ضروری کاربر مانند شناسه کاربری، نقش‌ها و سطح دسترسی اوست. جی دبلیو تی به سه بخش سربرگ (Header)، بار (Payload) و امضا (Signature) تقسیم می‌شود. سربرگ شامل الگوریتم امضا و نوع توکن است. بار، اطلاعات کاربر را به صورت JSON در خود جای داده و امضا تضمین‌کننده صحت و درستی اطلاعات است.

JWT چگونه کار میکند؟

فرآیند کار JWT به شرح زیر است:

درخواست ورود

کاربر با وارد کردن نام کاربری و رمز عبور خود در مرحله قبل اقدام به دریافت توکن نموده است. و هسته مرکزی با توجه به اطلاعات اراسلی و دسترسی های مجاز کاربر اثدام به تولید توکن میکند.

تولید توکن JWT توسط درخواست کننده

درخواست کننده باید در این مرحله با توجه به اطلاعات زیر توکن JWT خود را ایجاد نموده و بعنوان کلید دسترسی جهت ارتباط با هسته مرکزی در HEADER درخواست های خود آن را ارسال نماید.

اعتبارسنجی توکن JWT

در درخواست‌های بعدی، سرور توکن JWT را دریافت کرده و اعتبار آن را بررسی می‌کند. در صورتیکه توکن معتبر باشد، به کاربر اجازه دسترسی به منابع داده می‌شود.

در حال حاضر اعتبار توکن های JWT بمدت 7 روز می باشد. که البته این موضوع بسته به توکن تولید شده در مرحله اول هم دارد در صورتی که توکن تولید شده در مرحله اول اعتباری کمتر از 7 روز داشته باشد انقضأ توکن JWT به همان میزان در نظر گرفته خواهد شد.

ساختار JSON Web Token چگونه است؟

ساختار JWT به سه بخش تقسیم می‌شود که با . (dot) از هم جدا می‌شوند:

و ساختاری شبیه به xxxxx.yyyyy.zzzzz

Header چیست؟

Header از دو بخش تشکیل شده است که بخش اول الگوریتم آن را تعیین می‌کند و بخش دوم نوع آن را مشخص می‌کند، که طبیعتاََ JWT است.

این ساختار JSON با Base64Url رمز گذاری شده است تا به بخش اول آن شکل بدهد، منظور از بخش اول xxxxx.yyyyy.zzzzz است.

برای مثال:  

عنوان نوع وضعیت مقادیر توضیحات
alg String اجباری HS256 الگوریتم ارسال درخواست
typ String اجباری JWT نوع درخواست
{
    "alg": "HS256",
    "typ": "JWT"
}
Payload چیست؟

بخش دوم xxxxx.yyyyy.zzzzz) Token) را Payload تشکیل می‌دهد و شامل یک سری اطلاعات درباره‌ی کاربر و یک سری داده‌های اضافی‌اند، که استفاده از آن‌ها خیلی رایج است. Payloadها می‌توانند ساختاری شبیه به زیر داشته باشند.

عنوان نوع وضعیت مقادیر توضیحات
iss String اجباری   دامنه ثبت شده در هسته مرکزی
aud String اجباری api مخاطب شما که در مواردی که شما فقط استفاده کننده از API هستید برابر api باید باشد
iat Timestamp اجباری   زمان صدور توکن JWT
uuid Integer اجباری   سریال عددی درخواست کننده
uip IP اجباری   آدرس IP درخواست کننده
{
    "iss": "Your domain",
    "aud": "Your level",
    "iat": "Timestamp",
    "uuid": "Your ID",
    "uip": "Your IP"
}
Signature چیست؟

آخرین و مهم‌ترین بخش JWTها Signature است، در حقیقت Signature تایید می‌کند که آیا داده‌ای که از سمت کاربر برگشته است بهم ریخته و یا دستکاری شده است؟

الگوریتمی که ما برای رمزنگاری در Header داده‌ایم را می‌گیرد، header و Payload را ترکیب می‌کند و آن‌ها را دوباره رمزنگاری می‌کند و بار دیگر با کلیدی که به Signature داده ایم رمزنگاری می‌کند و اگر کسی مقدار رمزگذاری شده را تغییر دهد خطایی دریافت می‌کنیم که به ما نشان می‌دهد Signature معتبر نمی‌باشد.

Signatureها نیز ساختاری شبیه به زیر دارند.  

عنوان نوع وضعیت مقادیر توضیحات
Header base64UrlEncode اجباری   JSON هدر اینکد شده
Payload base64UrlEncode اجباری   JSON اطلاعات ارسالی اینکد شده
Signature String اجباری   توکن دریافتی از اتوماسیون
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),token)

خروجی این عملیات بعنوان توکن JWT برای ارسال درخواست ها استفاده شود.

PHP (با استفاده از کتابخانه firebase/php-jwt)

جهت سهولت در کار با توکن های JWT چند نمونه کد از زبان های مختلف برای شما آماده شده است

<?php
require 'vendor/autoload.php';
use \Firebase\JWT\JWT;

$key = "your_secret_key";
$header = [
    "alg" => "HS256",
    "typ" => "JWT"
];
$payload = [
    "iss" => "Your domain",
    "aud" => "Your level",
    "iat" => time(),
    "uuid" => "Your ID",
    "uip" => "Your IP"
];

$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;
?>

 

Python (با استفاده از کتابخانه PyJWT)

import jwt
import time

key = "your_secret_key"
header = {
    "alg": "HS256",
    "typ": "JWT"
}
payload = {
    "iss": "Your domain",
    "aud": "Your level",
    "iat": int(time.time()),
    "uuid": "Your ID",
    "uip": "Your IP"
}

token = jwt.encode(payload, key, algorithm='HS256', headers=header)
print(token)

 

JavaScript (با استفاده از کتابخانه jsonwebtoken)

const jwt = require('jsonwebtoken');

const key = "your_secret_key";
const header = {
    "alg": "HS256",
    "typ": "JWT"
};
const payload = {
    "iss": "Your domain",
    "aud": "Your level",
    "iat": Math.floor(Date.now() / 1000),
    "uuid": "Your ID",
    "uip": "Your IP"
};

const token = jwt.sign(payload, key, { algorithm: 'HS256', header: header });
console.log(token);

 

Node.js (با استفاده از کتابخانه jsonwebtoken)

const jwt = require('jsonwebtoken');

const key = "your_secret_key";
const header = {
    "alg": "HS256",
    "typ": "JWT"
};
const payload = {
    "iss": "Your domain",
    "aud": "Your level",
    "iat": Math.floor(Date.now() / 1000),
    "uuid": "Your ID",
    "uip": "Your IP"
};

const token = jwt.sign(payload, key, { algorithm: 'HS256', header: header });
console.log(token);

 

Java (با استفاده از کتابخانه java-jwt)

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        String key = "your_secret_key";
        Algorithm algorithm = Algorithm.HMAC256(key);

        String token = JWT.create()
                .withIssuer("Your domain")
                .withAudience("Your level")
                .withIssuedAt(new Date())
                .withClaim("uuid", "Your ID")
                .withClaim("uip", "Your IP")
                .sign(algorithm);

        System.out.println(token);
    }
}