Генерация JWT
JWT (JSON Web Token) должен быть подписан с использованием алгоритма HMAC-SHA256 (“HS256”), ключом для подписи является параметр secret
, который вы получите с остальными параметрами интеграции от службы заботы Экзамус.
Больше информации о JSON Web Token можно найти на jwt.io, там же есть ссылки на библиотеки для работы с ним.
JWT генерируется по правилам, описанным в разделе Запуск тестирования с прокторингом.
Обратите внимание: JWT должен генерироваться на стороне сервера, а не на стороне клиента, чтобы избежать утечки секретов.
Пример JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjMyMTM0IiwibGFzdE5hbWUiOiJTbWl0aCIsImZpcnN0TmFtZSI6IkpvaG4iLCJsYW5ndWFnZSI6ImVuIiwiYWNjb3VudElkIjoxMjMsImFjY291bnROYW1lIjoiQ29ycG9yYXRlIHVuaXZlcnNpdHkiLCJleGFtSWQiOiJhMzg3NTYyMyIsImNvdXJzZU5hbWUiOiJQaHlzaWNzIiwiZXhhbU5hbWUiOiJGaW5hbCB0ZXN0IiwiZHVyYXRpb24iOjEyMCwic2NoZWR1bGUiOmZhbHNlLCJwcm9jdG9yaW5nIjoib2ZmbGluZSIsImlkZW50aWZpY2F0aW9uIjoicGFzc3BvcnQiLCJzdGFydERhdGUiOiIyMDE4LTAzLTI3VDAwOjAwOjAwWiIsImVuZERhdGUiOiIyMDE4LTAzLTMwVDEyOjU1OjAwWiIsInNlc3Npb25JZCI6IjgyODMzMWJkYTAyNSIsInNlc3Npb25VcmwiOiJodHRwczovL2dvLmJhbmFuYXMuY29tL29wZW50ZXN0I3Rlc3QvYjM4NzU2MjMifQ.GxcAcW0xGVDoM-gTtKHMol5kXNhTXuzAY3ekZD5CWgQ
Payload
Полный список полей payload доступен в нашей документации по API.
{
"userId": "1232134",
"lastName": "Smith",
"firstName": "John",
"thirdName": "",
"language": "en",
"accountId": 123,
"accountName": "Corporate university",
"examId": "a3875623",
"courseName": "Physics",
"examName": "Final test",
"userAgreementUrl": "https://school.org/eula",
"duration": 120,
"schedule": false,
"auxiliaryCamera": false,
"proctoring": "offline",
"identification": "passport",
"rules": {
"allow_to_use_paper": false,
"allow_to_use_calculator": false
},
"startDate": "2018-03-27T00:00:00Z",
"endDate": "2018-03-30T12:55:00Z",
"sessionId": "828331bda025",
"sessionUrl": "https://go.bananas.com/opentest#test/b3875623",
"exp": 1612994131,
"biometricIdentification": {
"enabled": true,
"photo_url": "",
"skip_fail": false, "flow": "test-flow"
},
"scoreConfig": {
"cheater_level": 80,
"extra_user": 1.0,
"user_replaced": 1.0,
"absent_user": 1.0,
"look_away": 1.0,
"active_window_changed": 1.0,
"forbidden_device": 1.0,
"voice": 1.0,
"phone": 1.0
},
"visibleWarnings": {
"warning_extra_user_in_frame": false,
"warning_timeout": false
}
}
Пример кода для генерации данных для прокторинга на стороне LMS (backend)
import datetime
import uuid
import jwt
JWT_SECRET = None
USER_ID = None
ACCOUNT_ID = None
ACCOUNT_NAME = None
EXAM_ID = None
SESSION_ID = str(uuid.uuid4())
def get_user_data() -> dict:
return {
"userId": USER_ID,
"lastName": "lastname",
"firstName": "firstname",
"thirdName": "thirdname",
"language": "en",
}
def get_organization_data() -> dict:
return {
"accountId": ACCOUNT_ID,
"accountName": ACCOUNT_NAME,
}
def get_exam_data() -> dict:
start = datetime.datetime.now(tz=datetime.timezone.utc)
end = start + datetime.timedelta(days=1)
return {
"duration": 30,
"startDate": start.isoformat(),
"endDate": end.isoformat(),
"examId": EXAM_ID,
"examName": "test simple integration",
"proctoring": "offline",
"schedule": False,
"allowMultipleDisplays": True,
"identification": "face_and_passport"
}
def get_session_data() -> dict:
return {
"sessionId": SESSION_ID,
"sessionUrl": "https://example.org/",
}
def get_start_payload_data() -> dict:
return {
**get_user_data(),
**get_organization_data(),
**get_exam_data(),
**get_session_data()
}
def build_token(payload: dict, jwt_secret: str) -> str:
return jwt.encode(payload=payload, key=jwt_secret, algorithm="HS256")
def main():
assert JWT_SECRET is None
assert USER_ID is None
assert ACCOUNT_ID is None
assert ACCOUNT_NAME is None
assert EXAM_ID is None
assert SESSION_ID is None
token = build_token(payload=get_start_payload_data(), jwt_secret=JWT_SECRET)
print(token)
if __name__ == '__main__':
main()