Algoliaでは、別の親APIキーから virtual/secured API keys を生成できますが、サーバーへの呼び出しは必要ありません。
このように定義された「スコープ」(事前定義されたユーザーフィルターなど)でサーバー側で生成された仮想キーは、JSクライアントで公開でき、その仮想キーを使用して行われたAPI呼び出しが、仮想キーが生成されました。 Algoliaにリクエストすることなく、すべてのユーザーに対して1つの仮想キーを簡単に作成でき、各キーがユーザーに一意であることを確認できます。
これが Python実装 です。基本的に、親キーと事前定義されたクエリパラメーター(スコープ)を使用してHMACハッシュを作成し、生のクエリパラメーター文字列を使用して再度base64エンコードしていることがわかります。
わからないこと
この仮想キーを使用してAPI呼び出しが行われた場合、Algoliaはどのようにしてリクエストが有効であることを確認できますか?既存のすべてのAPIキーを反復処理し、同じHMAC + base64文字列を再生成して、送信されたキーと比較しますか?
これを達成するより良い方法はありますか?
ここでの秘訣は、アプリケーションが少数のキーを参照することです。したがって、サーバーはすべてのキーをすばやく反復します。また、サーバーはそのような計算のキャッシュを保存する場合があります--ランダムナンスは使用されない =アルゴリズム内。
Algolia検索クライアントを初期化する方法を見てみましょう:
client = SearchClient.create('YourApplicationID', 'YourAPIKey')
「親キー」から「保護されたAPIキー」を生成するアルゴリズムは次のとおりです。
securedApiKey = BASE64(HMAC[parentApiKey + query params] + query params)
query params
はHMAC値平文としてに連結されることに注意してください。したがって、サーバー側のアルゴリズムはおそらく次のようになります。
'YourApplicationID'
のキーを選択します。HMAC
およびquery parameters
を、secureApiKeyのBASE64から取得します。適切な親キーが見つかると、HMACが計算され、この情報を保存できるため、次のリクエストはHMAC * count of keys
ではなくmemcmp
に絞り込まれます。
このスキームで異なるキーを関連付ける別の方法は見当たりません。何か足りない場合は修正してください。