REST APIを使用して、APIキーを介した認証/認証を行います。
私はそれのための最良の場所を見つけ出そうとしたところ、多くの人々がProjectName-Api-Key
などのカスタムHTTPヘッダーの使用を提案していることがわかりました。例:
ProjectName-Api-Key: abcde
しかし、カスタムスキームでAuthorization
ヘッダーを使用することも可能であり、イデオロギー的に正しいです。例:
Authorization: ApiKey abcde
一方、カスタム認証スキームは予期せず、一部のクライアントでサポートされない可能性があり、いずれにしてもカスタムコードにつながる可能性があることを考慮しました。クライアントはそれについて何も期待していないため、カスタムヘッダーを使用することをお勧めします。
どの方法でAPIキーを送信しますか?
これは不必要だと言う人もいるかもしれませんが(、それほど前までは同意しませんでしたが)、最近では、Authorization
を使用すると、非常に多くの認証プロトコルが使用されます APIキー を渡すためのヘッダー APIキー はそれ自体が自己記述的ではないため、 type にも通知する価値があります 1。
なぜ価値があると思いますか?今日では、さまざまな認証または承認プロトコルをサポートすることが必須になっているためです。これらすべてのプロトコルにAuthorization
ヘッダーを使用する予定の場合は、認証サービスに一貫性を持たせる必要があります。送信するトークンの種類と適用する認証プロトコルを通信する方法もヘッダーに含める必要があります。
Authorization: Basic XXXX
Authorization: Digest XXXX
Authorization: Bearer XXXX
Authorization: ApiKey-v1 XXXX
Authorization: ApiKey-v2 XXXX
以前は気にしていませんでしたが、モバイルクライアントやセンサーを使用した後、どの更新が保証されないかを考え始めました。下位互換性を維持できるように、セキュリティの実装方法に一貫性を持たせるようになりました。トークンのタイプが通知されると、特定のクライアントのセット(古いもの)からのリクエストを無効にし、新しいスキームを追加して古いクライアントを新しいものと区別し、重大な変更を引き起こすことなく、1つまたは別のスキームの認証検証を変更できます。通知された承認スキームに基づいて、API Gatewayに特定のルールを適用することもできます。たとえば、古いスキームを、メインのスキームとは別にデプロイされているWeb APIの特定のバージョンにリダイレクトできます。
自分のスキームを実装する際に直面した問題は、コメントされたものと似ています。
一方、カスタム認証スキームは予期しないものであり、一部のクライアントでサポートされていない可能性があり、いずれにしてもカスタムコードにつながるという考慮事項が見つかりました
clientsと言って、ライブラリ、フレームワーク、 reverse proxies と言います。カスタムヘッダーは拒否または無視できます。さらに悪い場合には、衝突することもあります。
重要な利点の1つはキャッシュです。特に明記しない限り、共有キャッシュはヘッダーをキャッシュしません(もちろん、これは問題ありません)。
私の経験では、実装にはほとんど同じ作業と時間を費やしましたが、カスタムヘッダーを実装した場合は、設計の余地が少しあるというわずかな違いがあります。ただし、設計の余地が増えると、物事を複雑にする可能性も高まります。
技術的には2つの間にほとんどまたはまったく違いがない可能性がありますが、一貫性は、それが私に提供するもの、明確さと理解のために私が評価するすべてのソリューションの特性であることがわかりました。私の場合、新しいスキームの追加は、2つの新しい抽象化(同じ具象クラスによって実装)を追加するために削減されました:TokenHandlerおよびTokenValidator。ハンドラーは、要求ヘッダーAuthorizationがサポートされるスキームに通知するかどうかのみを確認します。 Validatorは、トークンを検証するために必要なものです。フィルターのチェーンや大きな泥の塊からではなく、単一のリクエストフィルターから完全に機能します。
1:私はこれを見つけます answer APIキーに関して非常に明確である