web-dev-qa-db-ja.com

Web API認証スキームを確認する

私が書いているWeb APIに使用する許可/認証スキームについてのアドバイスが欲しいのですが。

まず、認証:

1)ユーザーが最初にログインして認証されたときに、一意のトークンをクライアントに送り返します。このトークンは、ユーザーを認証するために、後続のAPIリクエストで使用されます。

  • この一意のトークンをユーザーデータベースの行に保存し、ログアウトやタイムアウトなどでデータベースから削除する予定です。
  • 「ユーザー/ユーザーのIP /タイムスタンプ」の形式でトークンを作成することを計画していました
  • ユーザーがトークンを送り返すと、IPを解析して現在のリクエスターのIPと比較します。それが成功した場合は、データベースでトークンを検索し、データベースのトークンとクライアントのトークンを比較します。

私が助けを必要とする部分は、トークンの作成に使用する暗号化のタイプです。私はRSAを使用することを計画していましたが、トークンは強迫観念のように思われる50文字以上になりました。 トークンが長すぎないように使用するためのより良い暗号化とは何ですか?

  • その他の注意点は、SSLを使用してログインし、ユーザーを登録しますが、データを要求しないため、要求はオープンテキストになります。

2)2番目は、ユーザーの許可です。

  • ユーザーが最初に登録するときに、BCryptから生成されたソルトでパスワードをソルトし、そのパスワードをハッシュします。
  • ソルトとハッシュ化されたパスワードをデータベースに保存します。
  • ユーザーがログインしたい場合は、新しいパスワードにハッシュを追加して、データベースのハッシュされたパスワードと比較します。

これは承認の良い形式ですか?

あなたが提供できるあらゆる助けをありがとう。

3
Chrisgozd

Re:トークン

  • トークンとして長いランダム文字列を使用するだけです。好きなだけ作ることができます。トークン自体で使用するユーザーIDを「暗号化」するのはなぜですか? (または私は何かを誤解していますか?)
  • オプションで、ユーザーIPとトークンの有効期限をトークン自体に格納することもできますが、データベースを使用している場合は、これらを個別のDBフィールドに格納することもできます(user_id, token, token_expires_at, ip_address)。
  • トークンはrandomString123-$IPADDRESS-$EXPIRATIONのようになります。
  • リクエストが来たら、IPが同じであること、有効期限が未来であること、およびトークンがDBに存在することを確認します(ランダムな部分だけでなく、完全な文字列を確認してください!)。

Re:SSL

リクエストにSSLを使用していない場合、データとトークンは実際には秘密ではありません。まずこれを修正する必要があります。

2
Joel L