2016-10-05 24 views
4

Laravel/PHPでアプリケーションを開発しており、ユーザーごとの有料料金設定モデルを使用したいと考えています。そのためには、アカウントを1人の同時ユーザーしか使用できないようにする必要があります。私たちは認証にJWTを使用しており、ステートレスなので、セッションは使用できません。は、JWTのログインごとに1人の同時ユーザーを許可します

1人の同時ログインを保証するために、私はブラウザエージェントまたはIPを囲むことができますが、両方が一意ではなく、たとえば複数の場合に一度に発生する可能性があります。オフィス。また、私はMACアドレスを送信することができますが、それは最も簡単な方法ではありません。

JWTを使用するユーザーごとに1つの同時ログインを保証する他のソリューションはありますか?

+0

このRFC提案からいくつかのアイデアを得るかもしれません:https://tools.ietf.org/html/draft-jones-oauth-token-binding-00 – ingenious

答えて

0

サーバー上の状態を保存せずにこれを行うと考えることができるのは、トークンの有効期間に新しいトークンに署名する機能を無効にすることだけです。

+2

これはまた、ユーザーが別のデバイスに再度ログインするのを防ぎますブラウザがトークンの存続期間中に再起動された場合 –

3

私はこの単純な答えはいいえ、あなたはJWTでそれを行うことはできず、サーバーをステートレスに保つことができないと思います。

  1. ユーザーがログイン

    、あなたがDB
  2. アクセストークンの有効期限が切れで更新トークンを格納します。あなたはアクセストークンとリフレッシュトークンを使用してセットアップを使用する場合は、あなたはおそらくこのような何かを達成することができます。リフレッシュトークンから新しいアクセストークンを発行する前に、そのアカウントがまだOKであることを確認し、リフレッシュトークンとDB内のトークンを比較します。それらが一致することを確認してください。
  3. 2人目のユーザーが同じアカウントでにログインしています。問題をデータベースにリフレッシュトークンを保存し、古いリフレッシュトークンを上書きする。 (アカウントごとに1つのリフレッシュトークンが保存されます)
  4. 最初のユーザーのアクセストークンがもう一度期限切れになります。今回はDBに別の更新トークンがあり、そのユーザーに対して新しいアクセストークンは発行されません。

これにより、最新のログインユーザーがサービスを利用できるログインフローが発生します。これは、実際にデバイスを変更したり、ブラウザセッションを再開したりする同じユーザーの場合に便利です。たとえば、Spotifyの「ストリームを追う」というコンカレントリスニングの処理方法と比較してください。

+0

暗黙のフローを使用するSPAアプリケーションでは、この場合、リフレッシュトークンの概念はありません。 ? – Jay

+0

ポイント3とポイント4が正しく理解されていれば、最初のユーザーのトークンが期限切れではなく、2番目のユーザーがログインすると、最初のユーザーのトークンが期限切れになるまで両方のユーザーがログインしたままになる状況はありませんか? – Hiren

0

私はJWTを使わずにテストし、パスワード認可トークンを使ってOAuth2認証を受けました。 1クライアント内では、ユーザーは1つのログインでのみアプリケーションを使用できます。別のセッション/デバイスでログインすると、もう一方のログイン(トークン)はもう有効になりません。 1人のユーザーが複数回ログインできるようにする場合(Webアプリやモバイルアプリなど)、複数のクライアントを使用できます。

関連する問題