web-dev-qa-db-ja.com

Algoliaの仮想APIキーはどのように機能しますか?

Algoliaでは、別の親APIキーから virtual/secured API keys を生成できますが、サーバーへの呼び出しは必要ありません

このように定義された「スコープ」(事前定義されたユーザーフィルターなど)でサーバー側で生成された仮想キーは、JSクライアントで公開でき、その仮想キーを使用して行われたAPI呼び出しが、仮想キーが生成されました。 Algoliaにリクエストすることなく、すべてのユーザーに対して1つの仮想キーを簡単に作成でき、各キーがユーザーに一意であることを確認できます。

これが Python実装 です。基本的に、親キーと事前定義されたクエリパラメーター(スコープ)を使用してHMACハッシュを作成し、生のクエリパラメーター文字列を使用して再度base64エンコードしていることがわかります。

わからないこと

この仮想キーを使用してAPI呼び出しが行われた場合、Algoliaはどのようにしてリクエストが有効であることを確認できますか?既存のすべてのAPIキーを反復処理し、同じHMAC + base64文字列を再生成して、送信されたキーと比較しますか?

これを達成するより良い方法はありますか?

2
jeffreyveon

ここでの秘訣は、アプリケーションが少数のキーを参照することです。したがって、サーバーはすべてのキーをすばやく反復します。また、サーバーはそのような計算のキャッシュを保存する場合があります--ランダムナンスは使用されない =アルゴリズム内。

Algolia検索クライアントを初期化する方法を見てみましょう:

client = SearchClient.create('YourApplicationID', 'YourAPIKey')

「親キー」から「保護されたAPIキー」を生成するアルゴリズムは次のとおりです。

securedApiKey = BASE64(HMAC[parentApiKey + query params] + query params)

query paramsはHMAC値平文としてに連結されることに注意してください。したがって、サーバー側のアルゴリズムはおそらく次のようになります。

  1. ステップ1:「親キー」としてのみ'YourApplicationID'のキーを選択します。
  2. 手順2:HMACおよびquery parametersを、secureApiKeyのBASE64から取得します。
  3. ステップ3:HMAC(adminApiKey、query params)== secureApiKeyのHMAC?
  4. ステップ4:HMAC(searchApiKey、query params)== secureApiKeyのHMAC?
  5. 手順5:別のキーを試します。
  6. 手順6:適切なキーを選択するか、それ以外の場合-エラー。

適切な親キーが見つかると、HMACが計算され、この情報を保存できるため、次のリクエストはHMAC * count of keysではなくmemcmpに絞り込まれます。

このスキームで異なるキーを関連付ける別の方法は見当たりません。何か足りない場合は修正してください。

0