7

Oauth、Oauth2、JWT などに関する投稿が既にたくさんあることは知っています。たくさん読んだことがあり、これまで以上に混乱しているので、明確化を求めています。この件に関する私の見解を提案します。誰かが私の実装が十分に安全かどうか、または私が間違っていることとそれを改善する方法を教えてくれることを願っています.

リソースをユーザーに提供するための API Rest サーバーを構築しています。ユーザーがお金を入金、引き出し、送金できる銀行アプリだとしましょう。

サーバーに nodejs、hapijs、jsonwebtokens、および bcrypt を使用しています。2トークン認証フロー(Oauth2)を実装したい。

これは私がやっている方法です:

  1. ユーザーは、資格情報 (ユーザー名とパスワード) を指定して認証サーバーにログインします。

  2. サーバーはユーザーの資格情報を検証し、有効な場合はユーザーにアクセスを許可し、更新トークンとアクセス トークンを返します。

    • これらのトークンは、ブラウザーまたはモバイル デバイスのローカル ストレージに保存されます。

    • access token:_

      • jsonwebtoken として署名されています。
      • 発行日、有効期限 (5 分)、ユーザー データ (id、ユーザー名) が含まれます。
    • refresh token:_

      • jsonwebtoken として署名され、bcrypt で暗号化されます。
      • 一意の識別子が含まれています
      • 有効期限が含まれる場合があります
      • データベースに保存されます。
  3. が有効である限りaccess token、つまり有効期限が切れておらず、有効なユーザー データが含まれている限り、リソース サーバーは要求されたリソースをユーザーに提供します。

  4. access token有効でなくなると、認証サーバーはクライアントにrefresh token、新しいaccess token

    • サーバーはrefresh tokenユーザーから を受け取り、それを解読し、データベース内のものと比較し、取り消されたかどうかを確認し、その一意の識別子を確認します。
    • refresh tokenがすべてのテストに合格すると、サーバーはクライアントに new を発行しますaccess token
    • 1 つのテストにrefresh token失敗すると、サーバーはユーザーに再認証を要求します。

注: Cookie の使用を避けようとしています。

質問:

  • ユーザーが を盗むことができれば、access tokenも盗むことができると思いrefresh tokenます。では、どうすればrefresh tokenより安全にすることができますか?
  • Oauth2 フローに対する私の見方は正しいですか?
  • 何を改善できますか?
  • 何か不足していますか?
4

1 に答える 1

1

OAuth2 が多くの人にとって混乱を招く理由は、使用するクライアントの種類に応じて異なる認証フローを使用するためです。

OAuth2では、機密または公開の2 つのクライアント タイプが区別されます。その隣には、ブラウザまたはブラウザ コントロールで使用するためのリダイレクト ベース (認証コードおよび暗黙的) の 2 つの許可フローがあります。

他の 2 つのフロー (リソース所有者のパスワードとクライアント資格情報) は、ブラウザー以外のアプリ (CLI、バックグラウンド サービス、信頼できるモバイル クライアント) から使用するためのものです。

さまざまなフローと、それらをいつ使用するかについては、こちらの回答で詳しく説明しました。

于 2015-10-29T22:21:18.297 に答える