web-dev-qa-db-ja.com

これは正しいJWT認証実装ですか?

Flask RESTful APIを作成しました。これには、メール/パスワードとFacebookログインフローが必要です。今後、ソーシャルログインをサポートするために、これを拡張する必要があるでしょう。

JWTを使用してユーザーを認証することを選択しました。

複数のタイプのログインフローをサポートしたいので、ログインのタイプごとにカスタム許可タイプを定義する必要があると考えました。

Flask-JWT を確認しましたが、これは、更新トークンの場合でも、カスタムの付与タイプをサポートしていないようです。

別のFlask JWT実装を見つけることができなかったため、自分でコードを記述する必要がありました。私のコードは機能しますが、Flask私の要件を満たすプラグイン。

  • カスタムの助成金タイプを定義するのは良い習慣ですか? rfc6749 がサポートされていることを示します。
  • 電子メール/パスワード/更新トークン認証フローを正しく実装しましたか( 図1 )?
  • Facebook認証フローを正しく実装しましたか( 図2 )?
  • 私はuuid4を使用して更新トークンを生成しています。これは良い考えですか?

Email login flow

Facebook login flow

7
Remco Haszing

免責事項:それは答えよりもコメントですが、より多くのスペースが必要でした。

まず、JWTは単純ですが、OAuth2フローは複雑で扱いにくい傾向があります。 Google、Facebookなどを使用して認証するため、通常は直接トークンを受け取りません。

  1. ユーザーが「ログインしたい」と言う
  2. あなたのアプリは言う、ああ、ええと、ここにFacebookリダイレクトがあります
  3. ユーザーがサインインすると、あなたからのコールバックURLがコードで呼び出されます
  4. サーバー側では、コードを受け取り、Google/Facebookを呼び出してJWTのコードを交換します
  5. 今、あなたはそれを確認します
  6. 次に、ユーザーが認証され、元のページにリダイレクトできます

...また、多くのプロバイダーが処理方法を少しずつ異なるという意味で厄介な場合もあります。プロバイダーごとに、秘密鍵のペアを登録して保存する必要があります。

正直なところ、これは面倒なので、次のようなサードパーティのサービスを使用することをお勧めします https://auth0.com/

更新:その間、私はOAuthライブラリが進歩し、auth0.comのサービスがより多くなる一方で、よりシンプルになったように感じますですから、多くの認証プロバイダーをサポートする必要がある場合を除いて、コードライブラリを直接使用することをお勧めします。

フローは同じですが、少なくとも合理化されています。 (そして、私は彼らとは何の関係もありません)

2
dagnelies