接入 BytePower

# Server API 接入

对于服务端到 BytePower 的请求,采用 JWT 进行鉴权,并通过 HTTP 请求 Header X-BytePower-Auth-Token 携带。JWT 采用 HS256 算法,payload 需要包含 iatkey_name 字段,iat 是以毫秒为单位的时间戳,key_name 是在 BytePower 控制台生成的 API Keys 的 name。

  • 生成 JWT 的 python 示例如下所示:
import time
import jwt


# 这里的 key_id 和 key_secret 请在 BytePower 控制台 -> Basic Information -> API Keys 获取,选取的 key 类型为 server_key。

def generate_jwt_token(key_id, key_secret, algorithm="HS256"):
    current_time = int(time.time() * 1000)
    payload = {
        "iat": current_time,
        "key_name": key_id
    }
    token = jwt.encode(payload, key_secret, algorithm="HS256")
    return token.decode("utf-8")
  • 调用接口
curl -X "POST" "http://xxx.bytepowerapp.cn/bp/server/user/login" \
     -H 'Content-Type: application/json' \
     -H 'X-BytePower-Auth-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOiIiLCJrZXlfbmFtZSI6ImE0MjNmZWJmMzYyMzQ0NWIifQ.wyUKpjlZoFEQjG4b40unED1bh_1SFrIVNwjnDv7Zru4' \
     -d $'{
  "login_device_id": "test1",
  "device": {
    "id": "test2"
  },
  "cuid": "test1"
}'

# Client API 接入

对于 Client 到 BytePower 的请求,用 session 进行身份验证。session 信息通过 HTTP 请求 Header X-BytePower-Session-Token 携带。 并且需要对请求体签名,并将签名字符串通过 HTTP header X-BytePower-Sign 发送给服务端。签名算法:Hmac SHA256。

  • 生成签名的 python 示例如下所示:
import time, hmac, hashlib,

def sign(app_id, key_id, key_secret, data):
    # 以 ms 为单位的时间戳
    timestamp = str(int(time.time() * 1000))
    # 注意是对 app_id,timestamp 和 data 的拼接结果进行签名
    msg = to_bytes(app_id) + to_bytes(timestamp) + to_bytes(data)

    digest = hmac.new(to_bytes(key_secret), to_bytes(msg), hashlib.sha256).hexdigest()

    return "%s,%s,%s" % (digest, timestamp, key_id)


def to_bytes(s):
    if isinstance(s, str):
        return s.encode("utf-8")
    if isinstance(s, bytes):
        return s
    raise ValueError("s should be str or bytes")


  • 调用接口
import requests, json


body = '{"anonymity": {"local_uid": "app_uid_1234"},"cuid": "test_custom_uid","segment_id": "test_segment_uid","custom_config_id": "custom_config_id_123"}'
signature = sign(
    "Your AppID",
    "Your KeyID",
    "Your Client Key Secret",
    a,
)

print(
    requests.post(
        "https://xxx.bytepowerapp.cn/bp/user/login",
        data=body,
        headers={"X-BytePower-Sign": signature},
    ).json()
)
上次更新: 2023/11/21 16:56:14