Name | exn-report-sdk JSON |
Version |
0.1.5
JSON |
| download |
home_page | None |
Summary | Python SDK for Report Service. |
upload_time | 2025-02-03 10:58:32 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | MIT |
keywords |
report
sdk
api
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Exnodes Report Service SDK
Version: 0.1.0
# Khởi tạo client - install SDK
```
from exn_salon_report_sdk import ReportClient, ReportSDKException
api_key = "your_api_key"
secret_key = "your_secret_key"
client = ReportClient(api_key, secret_key)
# Gọi API để lấy báo cáo
try:
report_id = "12345"
report = client.get_report(report_id)
print("Report:", report)
# Tạo mới một báo cáo
new_report_data = {
"name": "Sales Report",
"filters": {"date_range": "2025-01-01 to 2025-01-20"},
}
new_report = client.create_report(new_report_data)
print("New Report Created:", new_report)
except ReportSDKException as e:
print("SDK Error:", str(e))
```
---------------------------------
# Xử lý phía Service Report
## 1. Lấy API key từ header.
```
api_key = request.headers.get("API-Key")
if not api_key:
return {"error": "API key is required"}, 401
secret_key = get_secret_key_from_db(api_key)
if not secret_key:
return {"error": "Invalid API key"}, 401
```
## 2. Xác minh chữ ký
```
import hmac
import hashlib
import base64
def verify_signature(secret_key, signature_payload, signature):
expected_signature = hmac.new(
secret_key.encode(),
signature_payload.encode(),
hashlib.sha256
).digest()
expected_signature = base64.b64encode(expected_signature).decode()
return hmac.compare_digest(expected_signature, signature)
# Xử lý chữ ký
signature_payload = f"{api_key}{timestamp}{request_payload}"
if not verify_signature(secret_key, signature_payload, received_signature):
return {"error": "Invalid signature"}, 401
```
## 3. Kiểm tra timestamp (chống replay attack):
```
from datetime import datetime, timedelta
def is_timestamp_valid(request_timestamp, max_skew_minutes=5):
try:
timestamp = datetime.fromisoformat(request_timestamp)
now = datetime.utcnow()
return abs((now - timestamp).total_seconds()) <= max_skew_minutes * 60
except ValueError:
return False
if not is_timestamp_valid(timestamp):
return {"error": "Invalid or expired timestamp"}, 401
```
Raw data
{
"_id": null,
"home_page": null,
"name": "exn-report-sdk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "report, sdk, api",
"author": null,
"author_email": "Exnodes <ryan@exnodes.vn>",
"download_url": "https://files.pythonhosted.org/packages/6b/ec/2f015913ddc26336123b7b85d38aab0b117abdd81a3d1ddf5b8178c089fd/exn_report_sdk-0.1.5.tar.gz",
"platform": null,
"description": "# Exnodes Report Service SDK\n\nVersion: 0.1.0\n\n# Kh\u1edfi t\u1ea1o client - install SDK\n```\nfrom exn_salon_report_sdk import ReportClient, ReportSDKException\n\napi_key = \"your_api_key\"\nsecret_key = \"your_secret_key\"\nclient = ReportClient(api_key, secret_key)\n\n# G\u1ecdi API \u0111\u1ec3 l\u1ea5y b\u00e1o c\u00e1o\ntry:\n report_id = \"12345\"\n report = client.get_report(report_id)\n print(\"Report:\", report)\n\n # T\u1ea1o m\u1edbi m\u1ed9t b\u00e1o c\u00e1o\n new_report_data = {\n \"name\": \"Sales Report\",\n \"filters\": {\"date_range\": \"2025-01-01 to 2025-01-20\"},\n }\n new_report = client.create_report(new_report_data)\n print(\"New Report Created:\", new_report)\n \nexcept ReportSDKException as e:\n print(\"SDK Error:\", str(e))\n```\n\n---------------------------------\n\n\n# X\u1eed l\u00fd ph\u00eda Service Report\n## 1. L\u1ea5y API key t\u1eeb header.\n```\napi_key = request.headers.get(\"API-Key\")\nif not api_key:\n return {\"error\": \"API key is required\"}, 401\n\nsecret_key = get_secret_key_from_db(api_key)\nif not secret_key:\n return {\"error\": \"Invalid API key\"}, 401\n\n```\n\n## 2. X\u00e1c minh ch\u1eef k\u00fd\n```\nimport hmac\nimport hashlib\nimport base64\n\ndef verify_signature(secret_key, signature_payload, signature):\n expected_signature = hmac.new(\n secret_key.encode(), \n signature_payload.encode(), \n hashlib.sha256\n ).digest()\n expected_signature = base64.b64encode(expected_signature).decode()\n return hmac.compare_digest(expected_signature, signature)\n\n# X\u1eed l\u00fd ch\u1eef k\u00fd\nsignature_payload = f\"{api_key}{timestamp}{request_payload}\"\nif not verify_signature(secret_key, signature_payload, received_signature):\n return {\"error\": \"Invalid signature\"}, 401\n```\n\n## 3. Ki\u1ec3m tra timestamp (ch\u1ed1ng replay attack):\n```\nfrom datetime import datetime, timedelta\n\ndef is_timestamp_valid(request_timestamp, max_skew_minutes=5):\n try:\n timestamp = datetime.fromisoformat(request_timestamp)\n now = datetime.utcnow()\n return abs((now - timestamp).total_seconds()) <= max_skew_minutes * 60\n except ValueError:\n return False\n\nif not is_timestamp_valid(timestamp):\n return {\"error\": \"Invalid or expired timestamp\"}, 401\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python SDK for Report Service.",
"version": "0.1.5",
"project_urls": {
"Homepage": "https://github.com/Salonbookly/Report-SDK"
},
"split_keywords": [
"report",
" sdk",
" api"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "ec063a2077e1be9b5f6e9cde0de9a3dc3615f1516770296c619df88d82bfc276",
"md5": "973f2ad86c90e30be2978777873d1a48",
"sha256": "e6c37dcc86ce7b8a7a3b6cfd9ffc6d91735e326d175ff88d3716a83a9629e70d"
},
"downloads": -1,
"filename": "exn_report_sdk-0.1.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "973f2ad86c90e30be2978777873d1a48",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 7059,
"upload_time": "2025-02-03T10:58:30",
"upload_time_iso_8601": "2025-02-03T10:58:30.977608Z",
"url": "https://files.pythonhosted.org/packages/ec/06/3a2077e1be9b5f6e9cde0de9a3dc3615f1516770296c619df88d82bfc276/exn_report_sdk-0.1.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6bec2f015913ddc26336123b7b85d38aab0b117abdd81a3d1ddf5b8178c089fd",
"md5": "97d2a8520a2e3cfc5ed64b6760f1fc40",
"sha256": "cbfdf14260f1453b4b868fb76b98cd34d033f1258c412c86551c3247bc414b95"
},
"downloads": -1,
"filename": "exn_report_sdk-0.1.5.tar.gz",
"has_sig": false,
"md5_digest": "97d2a8520a2e3cfc5ed64b6760f1fc40",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 6675,
"upload_time": "2025-02-03T10:58:32",
"upload_time_iso_8601": "2025-02-03T10:58:32.511227Z",
"url": "https://files.pythonhosted.org/packages/6b/ec/2f015913ddc26336123b7b85d38aab0b117abdd81a3d1ddf5b8178c089fd/exn_report_sdk-0.1.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-03 10:58:32",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Salonbookly",
"github_project": "Report-SDK",
"github_not_found": true,
"lcname": "exn-report-sdk"
}