つまり...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