現在、多くのAPI(サービス)は、OAuth、HTTP基本認証、またはAPIキーを使用してユーザーを認証しています。
私の目標は単純なセキュリティユーザーの認証をクライアント側のWebアプリケーションで見つけるステートレスone serviceの方法。
認証方法のいくつかについての私の見解は次のとおりです。
OAuthは素晴らしい解決策のように見えますが、-非常に複雑に設定されており、-過剰に見えるに見えます1つのサービスのみ。
[〜#〜] owasp [〜#〜] によると、HTTP基本認証は安全ではないため、アプリケーションでは使用しないでください "。
クライアント側のWebアプリケーションでプレーンなAPIキーを使用することは、HTTP基本認証と比較して改善のようには見えません。
私の代替案は、サービスで検証できる暗号化されたトークンを使用することです。
プレーンテキストはsecret keyを使用して暗号化されます。これはサーバーだけが知っています。
平文は[暗号化[〜#〜] aes [〜#〜]を使用してサーバー上でGCMモードになるため、整合性は操作されません。
ユーザーはloginに自分のユーザー名とパスワードを付けてトークンを受信する必要があります。このトークンはすべてのリクエストで送信され、サーバーではverifiedになります。
説明する:
+----------+ +-----------+
| +------ Login with user:pass ---->+ |
| Client | | API |
| +<---- Send encrypted token ----| |
| | | |
| +------ Use token to authenticate ---->+ |
+----------+ +-----------+
検証は次の方法で行うことができます。
このアプローチの可能なプロ:
このアプローチの考えられる欠点:
良い解決策は何だと思いますか?他の良い代替案を知っていますか?
提案されたソリューションは、JSON Web Tokens(JWT)とほぼ同じです。
詳細は https://jwt.io/ を参照してください。多くの十分にテストされたライブラリがこれらのトークンを処理するためにすでに存在しているので、独自にローリングするのではなく、この標準を使用して非常にうまく機能します。
パスワードが秘密鍵で暗号化または署名されているという事実から、パスワードが認証ルーチンによって作成されたことが証明されるため、通常はパスワードをトークンに格納する必要はありません。これは、パスワードを検証してトークンを生成する完全に独立した認証サービスを使用できるという重要な利点を提供しますが、メインアプリケーションは、読み取りトークン。
特定のサーバーとの関連付けについては、次の2つの方法のいずれかで複数のサーバーを処理できます。