exn-report-sdk


Nameexn-report-sdk JSON
Version 0.1.5 PyPI version JSON
download
home_pageNone
SummaryPython SDK for Report Service.
upload_time2025-02-03 10:58:32
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT
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"
}
        
Elapsed time: 0.66095s