接入 BytePower
Server API 接入
对于服务端到 BytePower 的请求,采用 JWT
进行鉴权,并通过 HTTP 请求 Header X-BytePower-Auth-Token
携带。JWT 采用 HS256 算法,payload 需要包含 iat
和 key_name
字段,iat
是以毫秒为单位的时间戳,key_name
是在 BytePower 控制台生成的 API Keys 的 name。
- 生成 JWT 的 python 示例如下所示:
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")
- 调用接口
shell
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 示例如下所示:
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")
- 调用接口
python
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()
)