web-dev-qa-db-ja.com

保護REST認証されたユーザーによるAPI

REST APIを構築したいのですが、セキュリティの部分でいくつかの穴があります。APIへの呼び出しを認証する方法を頭に入れたいです。

したがって、これはプロセスがどうあるべきかについての私の最初のドラフトです:

  1. ユーザーアカウントが作成されます
  2. トークンは自動的に生成され、dbに保存され、そのユーザーに関連付けられます
  3. ユーザーがloginエンドポイントを呼び出す
  4. トークンを応答トークンとして取得します
  5. トークンは、セッションが続く限りクライアント側に保存されます
  6. トークンは、残りの呼び出しを行うために使用されます

loginが呼び出されたときにトークンを返すという考えについては完全には確信していませんが、これが良い考えかどうかについて、あなたのアドバイスが必要です。そうでない場合は、この状況に対処するためのアドバイスをお願いします。

2
NeoChiri

手順2.では、トークンを作成するのではなく、ユーザー資格情報のエイリアスを作成します。

トークンの本当の目的は、クライアントセッション中に資格情報を取り除くことです。これは、ユーザーがIDの秘密の証拠を示すたびに、ユーザーはID自体を攻撃者に公開しているためです。

つまり、トークンは「ジャストインタイム」で生成する必要があります。ログイン後(通信が暗号化されている場合は、/ loginの応答として送信しても問題ありません)、ランダム(少なくとも部分的に)で一時的でなければなりません。攻撃者がそれらを盗むことができるように、限られた時間枠でのみダメージを与えることができます。トークンの有効期限を管理するには2つのオプションがあります

  1. ユーザーに再度ログインを強制する
  2. 更新トークンを使用する

更新トークンは、アクセストークンよりも長く存続し、特別な/ refreshエンドポイントへの要求を行うために、認証されていないユーザーを認証するために1回だけ使用できます。/refresh apiを呼び出すと、クライアントは新しいアクセストークンと新しい更新トークンを取得します。リークが発生した場合の主要なリスクがあるため、リフレッシュトークンを安全なストレージに保管するのはクライアントの責任です

4
Carmine Ingaldi

あなたが説明したルートに行きたいなら、これを調べることをお勧めします: https://winsmarts.com/access-tokens-and-refresh-tokens-and-id-tokens-5261bc26e8a2 。 OAUTH 2およびOIDCも参照してください。

しかし、私は前のコメントに同意します。自分で作成するよりも、吟味されたライブラリを使用するのが最善です。さらに、JWTについては注意が必要です。これらのトークンはbase64でエンコードされ、署名のみが暗号化されます。つまり、トークンがこれまでに侵害された場合、攻撃者はトークンの属性を見ることができます。さらに、強力なパスキーを使用しない場合、攻撃者が署名を解読する可能性があり、残りは履歴です。

私のアドバイスは、シーズントークンは、使用が接続されるたびに、一定の期間(15〜60分)後にランダムに生成する必要があるということです。これがどの言語であるかはわかりませんが、python参照をいくつか提供します(Pythonを使用している可能性があると思います)。ただし、Pythonを使用していない場合でも、これはそれでも正しい方向に向けます(概念的に言えば)1. https://oauthlib.readthedocs.io/en/latest/oauth2/tokens/bearer.html 2. https:/ /docs.python.org/3/library/secrets.html 3. http://python-oauth2.readthedocs.io/en/latest/token_generator.html

2
Mad Hatter

システムを保護する最初のルールは、セキュリティの部分を自分で書くことではありません。システムのセキュリティを他のサードパーティのライブラリやサービスに委任する必要があります。

ただし、下書きについては、ユーザーが最初にアカウントを作成したときではなく、ユーザーがログインしたときにトークンを生成する必要があります。トークンは寿命が短い必要があります。 Cookieまたは [〜#〜] jwt [〜#〜] を使用して、各API呼び出しのユーザーのIDを確認できます。また、APIのセキュリティ保護には2つの点があることに注意してください。ユーザーをauthenticateし、authorized彼らの要求。

1