php - ユーザーのIPをアクセストークンと一緒に保存し、laravel APIでトークンを検証するときにそれを現在のIPと比較する方法は?

okwaves2024-01-25  8

つまり...API にリクエストを送信するフロントエンド アプリケーションがあり、laravel で作成しています。

これは、アクセス トークンを作成するための、過度に単純化された Laravel の方法です。

$user = Auth::user();
$token = $user->createToken('authToken')->accessToken;

しかし、このトークンを作成するときに、何らかの方法でユーザーの IP を同じ DB レコードに保存したいと考えています。laravel は、新しく作成されたアクセス トークン (この SQL テーブル oauth_access_tokens にあります) を保存します。

ユーザーが「機密性の高い」情報を要求した場合、

アクセス トークンを作成した後に DB レコードを何らかの方法で更新せずに、または新しいテーブルを作成せずに、これらの IP を保存することは可能ですか?アクセス トークン全体を自分でプログラムし、その IP 検証も自分で実装するにはどうすればよいでしょうか?

追記この質問はまったく役に立ちません -> Laravel パスポート: API リクエスト時にクライアント IP を検証する方法

これには反対です。同じユーザーからの連続したリクエストが異なる IP アドレスから発信される正当な理由は数多くあります。

– rjdown

2020 年 9 月 4 日 20:50

@rjdown そうですね、しかしその一方で、より安全であり、ユーザーが「リクエスト」したい場合は、別の IP アドレスからの場合は、再度ログインして新しいアクセス トークンを作成するだけです

– センティッソ

2020 年 9 月 4 日 20:58

この場合、次回のリクエストで IP が再び変更される可能性があるため、再度ログインしても役に立ちません。そしてまた。そしてまた。これは、モバイル ユーザー、一部の VPN やプロキシを使用しているユーザー、および複数の接続を使用する一部のネットワーク設定に影響を与える可能性があります。次のような場合にも問題が発生する可能性があります。サービスを何らかの形式の負荷分散または CDN の背後に置きます。もちろん、これらの問題に関するサポート リクエストをすべて処理するかどうかはあなた次第です :D

– rjdown

2020 年 9 月 4 日 23:31



------------------------

IP アドレスによる検証

私も rjdown の指摘に同意しますが、自分ではそんなことはしないと言わざるを得ません。 IP ホワイトリストには標準ソリューションがあります。

ただし、使用できる興味深いソフトウェア パターンがあります。

アクセス トークンを最初に受信したときにクレームを作成する

IP アドレスを一種のクレームとして扱い、API のクレーム オブジェクトに含めます。もちろん、高セキュリティ/デジタルではありませんトークンのユーザー ID などの検証可能なクレーム。次に、クレームをメモリにキャッシュします。

IP アドレス フィルターを実装する

後続の API リクエストごとに、クレームをすばやく検索します。次に、フィルタ クラスを実行して、元のリクエストの IP を現在のリクエストと比較します。

このデザインパターンの詳細

ブログ投稿 サンプルコード - Authorizer クラスを参照

0



------------------------

認証された各ユーザーにはセッションがあるため、IP をセッションに保存して後で確認できます。

たとえば、現在の IP を取得します。

$currentIp = Request::ip();

後で別のリクエストの IP を取得し、最後に保存されたリクエストと比較できます。

セッション:

$old_ip = session('ip', null);
$current_ip = Request::ip();
if ($old_ip == null) {
  session(['ip' => $current_ip]);
} else if ($old_ip != $current_ip) {
  Auth::logout(); // rest in peace
}

3

私は純粋に REST API のために laravel を使用しており、その場合セッションは設定されていないため、これは機能しないのではないかと心配しています。

– センティッソ

2020 年 9 月 4 日 21:59

@SenTisso ちょっと待ってください =) REST は状態を保存しないことを意味します... では、古い IP はどのように保存するのでしょうか?

– アントン

2020 年 9 月 4 日 22:01

@SenTisso いずれにしても、何らかのストレージが必要になります。セッションと言うときはストレージを意味するため、実際にはセッションはデータベース、メモリ内 DB、Redis、プレーン テキスト ファイル、その他のオプションなど、あらゆる種類のストレージになります。

– アントン

2020 年 9 月 4 日 22:03

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。