Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Binance の認証 (Security Type) 仕様に準拠していない #192

Open
1 of 3 tasks
MtkN1 opened this issue Oct 31, 2022 · 2 comments
Open
1 of 3 tasks

Binance の認証 (Security Type) 仕様に準拠していない #192

MtkN1 opened this issue Oct 31, 2022 · 2 comments
Assignees

Comments

@MtkN1
Copy link
Member

MtkN1 commented Oct 31, 2022

課題

Binance のドキュメントによると、API 認証の Security Type は 3 つに分かれている。

https://binance-docs.github.io/apidocs/spot/en/#endpoint-security-type

  1. Headers に API キーなし、 Signature なし (Public 系)
  2. Headers に API キーあり、 Signature あり (Private 系)
  3. Headers に API キーなし、 Signature なし (Token 系)
Security Type Description
NONE Endpoint can be accessed freely.
TRADE Endpoint requires sending a valid API-Key and signature.
MARGIN Endpoint requires sending a valid API-Key and signature.
USER_DATA Endpoint requires sending a valid API-Key and signature.
USER_STREAM Endpoint requires sending a valid API-Key.
MARKET_DATA Endpoint requires sending a valid API-Key.

pybotters は認証を無効にすると 1. 、 認証を有効にすると 2. のリクエストが行えるが、 3. の認証については対応できていない。
結果、 Spot / Margin において User Data Streams の Token リクエスト /fapi/v1/listenKey がエラーとなっている。

API 本番環境では Spot / Margin の API サーバーのみエラーを返され、 USDⓈ-M / COIN-M の API サーバーではこの仕様に準拠していなくても (3. の認証でも) リクエストは成功となっている。

#190 で Spot エンドポイントの簡易的な修正を行うが、 pybotters はライブラリとしてこの仕様に準拠することが必要か、見通しよく実現可能か検討する。

調査

  • Security Type がエンドポイントパスから判別可能か調査する (全てを網羅するのは現実的ではない)
    • -> 判別不可能

対応方針

ユーザー自身において、リクエストするエンドポイントの Security Type ごとに認証を分ける必要がある
なお v0.14.0 においては以下の通り、一部認証不可となっている。

v0.14.0 with Spot エンドポイントにおいての現状

Security Type Description
NONE 自動認証が入るとエラーになる、リクエストの引数 auth=None で認証を無効にする
TRADE 自動認証可能
MARGIN 自動認証可能
USER_DATA 自動認証可能
USER_STREAM /api/v3/userDataStream のみハードコードされ認証可能、それ以外はエラーとなり認証不可能
MARKET_DATA エラーとなり認証不可能

experimental ブランチ #147 での本対応

次期 pybotters.Client では以下のように認証オブジェクトをモジュール化する予定である。

auth = pybotters.SomeExchangeAuth(key="...", secret="...")
r = await client.get("/path/to/endpoint", auth=auth)

これが可能になれば、Binance の Security Type ごとの認証を実装することでユーザー自身で正常な認証を選択可能になる。 この Issue は上記が実現されたらクローズする。

  • 認証オブジェクトがモジュール化される
  • Security Type ごとの認証クラスを実装する

Originally posted by @MtkN1 in #190 (comment)

@MtkN1 MtkN1 self-assigned this Oct 31, 2022
@MtkN1
Copy link
Member Author

MtkN1 commented Nov 21, 2022

エンドポイントからは判別不可能だった。 以下は API ドキュメントから調べたエンドポイントタイプに属するパスを表したオブジェクト。 それぞれエンドポイントタイプ内のパスに関連性がない。

{
    "spot": {
        "NONE": [
            ...  # 多数の為省略
        ],
        "TRADE": [
            "POST /sapi/v1/asset/convert-transfer",
            "POST /api/v3/order/test (HMAC SHA256)",
            "POST /api/v3/order (HMAC SHA256)",
            "DELETE /api/v3/order (HMAC SHA256)",
            "DELETE /api/v3/openOrders",
            "POST /api/v3/order/cancelReplace",
            "POST /api/v3/order/oco (HMAC SHA256)",
            "DELETE /api/v3/orderList (HMAC SHA256)",
            "GET /api/v3/rateLimit/order",
            "POST /sapi/v1/margin/order (HMAC SHA256)",
            "DELETE /sapi/v1/margin/order (HMAC SHA256)",
            "DELETE /sapi/v1/margin/openOrders (HMAC SHA256)",
            "POST /sapi/v1/margin/order/oco (HMAC SHA256)",
            "DELETE /sapi/v1/margin/orderList (HMAC SHA256)",
            "DELETE /sapi/v1/margin/isolated/account (HMAC SHA256)",
            "POST /sapi/v1/margin/isolated/account (HMAC SHA256)",
            "GET /sapi/v1/margin/rateLimit/order",
            "POST /sapi/v1/algo/futures/newOrderVp (HMAC SHA256)",
            "POST /sapi/v1/algo/futures/newOrderTwap (HMAC SHA256)",
            "DELETE /sapi/v1/algo/futures/order (HMAC SHA256)",
            "POST /sapi/v1/bswap/liquidityAdd (HMAC SHA256)",
            "POST /sapi/v1/bswap/liquidityRemove (HMAC SHA256)",
            "POST /sapi/v1/bswap/swap (HMAC SHA256)",
            "POST /sapi/v1/bswap/claimRewards (HMAC SHA256)",
            "POST /sapi/v1/loan/vip/repay",
            "POST /sapi/v1/loan/borrow",
            "POST /sapi/v1/loan/repay",
            "POST /sapi/v1/loan/adjust/ltv",
            "POST /sapi/v1/loan/customize/margin_call",
            "POST /sapi/v1/giftcard/buyCode (HMAC SHA256)",
        ],
        "MARGIN": [
            "POST /sapi/v1/margin/transfer (HMAC SHA256)",
            "POST /sapi/v1/margin/loan (HMAC SHA256)",
            "POST /sapi/v1/margin/repay (HMAC SHA256)",
            "POST /sapi/v1/margin/isolated/transfer (HMAC SHA256)",
        ],
        "USER_DATA": [
            ...  # 多数の為省略
        ],
        "USER_STREAM": [
            "POST /api/v3/userDataStream",
            "PUT /api/v3/userDataStream",
            "DELETE /api/v3/userDataStream",
            "POST /sapi/v1/userDataStream",
            "PUT /sapi/v1/userDataStream",
            "DELETE /sapi/v1/userDataStream",
            "POST /sapi/v1/userDataStream/isolated",
            "PUT /sapi/v1/userDataStream/isolated",
            "DELETE /sapi/v1/userDataStream/isolated",
        ],
        "MARKET_DATA": [
            "GET /api/v3/historicalTrades",
            "GET /sapi/v1/margin/asset",
            "GET /sapi/v1/margin/pair",
            "GET /sapi/v1/margin/allAssets",
            "GET /sapi/v1/margin/allPairs",
            "GET /sapi/v1/margin/priceIndex",
            "GET /sapi/v1/mining/pub/algoList (HMAC SHA256)",
            "GET /sapi/v1/mining/pub/coinList (HMAC SHA256)",
            "GET /sapi/v1/portfolio/collateralRate",
            "GET /sapi/v1/blvt/tokenInfo",
            "GET /sapi/v1/bswap/pools",
        ]
    }
}

判別はユーザー自身や wrapper が行うのが望ましい。

@MtkN1
Copy link
Member Author

MtkN1 commented Jan 10, 2024

にて USER_STREAM の認証ロジックがちょっと向上しました。

https://github.com/MtkN1/pybotters/blob/748f7786fbf1a651429ec70008963ea6b0b9278e/pybotters/auth.py#L64-L67

ハードコードなものの userDataStream (現物) 以外の listen-key (マージン) listenKey (先物) のリッスンキーに準拠 (ヘッダーに API キーのみを付与して、URL クエリにはタイムスタンプと署名は付与しない) できています。 引き続き MARKET_DATA は準拠不可です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant