web-dev-qa-db-ja.com

Laravel Sanctum auth:sanctumミドルウェアとAngular SPA非認証応答

次の設定のアプリケーションがあります。

Laravel

ホスト:appname.local:8000

環境変数:

  • SESSION_DRIVER =データベース
  • SESSION_LIFETIME = 480
  • SESSION_CONNECTION = mysql
  • SESSION_DOMAIN = .appname.local
  • SESSION_SECURE_COOKIE = false
  • SESSION_COOKIE = appnameapi_session
  • SANCTUM_STATEFUL_DOMAINS = '。appname.local、localhost、127.0.0.1'

角度

ホスト:appname.local:4200

現時点で機能するもの:

  • ブラウザでCSRFトークンを設定するSanctumのcsrf-cookieエンドポイントを呼び出すことができます。
  • 次に、APIのログインエンドポイントを呼び出して、Auth :: attempt()を使用してLaravelアプリでユーザーを認証できます。これにより、以下のようにセッションテーブルに新しいエントリが作成されます。

トークンを取得してユーザーを認証する角度付きメソッドAngular methods to get token and login

認証成功後のセッションデータベースエントリSession database entry after successful authentication

機能しないもの:

次のミドルウェアauth:sanctumによって保護されているルートへの後続の要求は、すべて認証されていない応答になります。 HTTP要求がコントローラーに到達することはありません。

auth:sanctum保護されたルートauth:sanctum protected routes

しかし、Cookieが送信されていることを開発者のコ​​ンソールで確認できます。だから私はなぜSanctumが認証を取得していないのか分かりません enter image description here

私はいくつかのチュートリアルを実行しましたが、Laravelの認証ミドルウェアが、ユーザーをすでに認証したことを認識できない理由を理解できていないようです。

私が間違っている可能性があることを誰かが知っていますか?

2
Gloire

エデンは正しいと思います。私は無関係な理由でこの質問にアクセスしていますが、サブドメインをサポートするために、SESSION_DOMAIN環境変数にドットを使用できますが、SANCTUM_STATEFUL_DOMAINSは使用できません。

ローカルと本番の両方で有効な環境設定は次のとおりです。

./。env

# localhost
SANCTUM_STATEFUL_DOMAINS="angular-site.test"
SESSION_DOMAIN=".angular-site.test"

# production
# SANCTUM_STATEFUL_DOMAINS="hockeysticks.net"
# SESSION_DOMAIN=".hockeysticks.net"

これにより、Cookieはauth.hockeysticks.netproduct.hockeysticks.netservice.hockeysticks.netapi.hockeysticks.netなどの複数のサブドメインで機能します。

人がSESSION_DOMAINにドットを入れても、サブドメインがない場合でもCookieは機能しますが、その場合は省略した方が理論的に安全です。

Laravelの開発者であるMohamed SaidによるSanctumについてのビデオはこちらです https://www.youtube.com/watch?v=Kd3hcrxtTHA 。その中で、彼は認証ロジックをウォークスルーします。

1
agm1984

同じ問題がありました。リクエストがポート番号に設定されていないアプリから行われた場合、sanctum SPA APIは正常に機能することがわかりました。

フロントエンドアプリをホストできます

appname.local

appname.local:4200の代わり

0
varun sharma