Laravel Sanctum 登录后未认证

huangapple go评论104阅读模式
英文:

Laravel Sanctum Unauthenticated after login

问题

我正在尝试为SPA(React)与Sanctum设置身份验证。

每当我成功登录,然后尝试访问auth:sanctum中间件中的路由时,它会返回401未经授权的错误。

以下是我的URL:

SPA:localhost:3000

后端:https://local-erp.XXX.com/

以下是我的配置文件:

sanctum.php:

  1. 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
  2. '%s%s',
  3. 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1,https://local-erp.XXX.com',
  4. Sanctum::currentApplicationUrlWithPort()
  5. ))),

kernel.php:

  1. protected $middlewareGroups = [
  2. 'web' => [
  3. \App\Http\Middleware\EncryptCookies::class,
  4. \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  5. \Illuminate\Session\Middleware\StartSession::class,
  6. \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  7. \App\Http\Middleware\VerifyCsrfToken::class,
  8. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  9. ],
  10. 'api' => [
  11. \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
  12. \Illuminate\Routing\Middleware\ThrottleRequests::class . ':api',
  13. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  14. ],
  15. ];

.env:

  1. SESSION_DOMAIN:.localhost

我还尝试过*.localhostlocalhost

这是我的LoginController:

  1. <?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\Http\Controllers\Controller;
  4. use App\Providers\RouteServiceProvider;
  5. use App\Service\Ldap;
  6. use Illuminate\Foundation\Auth\AuthenticatesUsers;
  7. use Illuminate\Http\Request;
  8. class LoginController extends Controller
  9. {
  10. use AuthenticatesUsers;
  11. protected $redirectTo = RouteServiceProvider::HOME;
  12. public function __construct()
  13. {
  14. $this->middleware('guest')->except('logout');
  15. }
  16. public function username()
  17. {
  18. return 'username';
  19. }
  20. protected function credentials(Request $request)
  21. {
  22. return [
  23. 'sAMAccountName' => $request->username,
  24. 'password' => $request->password
  25. ];
  26. }
  27. }

这是我的查询:

  1. axios.get("https://local-erp.XXX.com/sanctum/csrf-cookie").then(response => {
  2. axios.post("https://local-erp.XXX.com/login", {username: "xxx", password: "xxxx"})
  3. })

这两者都返回204 OK状态码。

然后,当我发送这个查询:

  1. const querytest = () => {
  2. axios.get('https://local-erp.XXX.com/api/users/5/holiday-balance')
  3. }

它返回{"message":"Unauthenticated."}

我知道有很多关于这个问题的帖子,但我尝试了所有我能找到的东西,没有解决我的问题。

值得注意的是,我实际上正在将一个Laravel Blade应用程序移动到一个独立的SPA和后端应用程序中。目前,身份验证是通过LDAP工作的(必须继续工作)。

非常感谢您的帮助!

英文:

I'm trying to setup auth for SPA (react) with sanctum.

Whenever I login successfully, and then, try to get a route that is in auth:sanctum middleware, it return me 401 Unauthenticated.

These are my urls :

SPA : localhost:3000

Backend : https://local-erp.XXX.com/

These are my config files :

sanctum.php :

  1. &#39;stateful&#39; =&gt; explode(&#39;,&#39;, env(&#39;SANCTUM_STATEFUL_DOMAINS&#39;, sprintf(
  2. &#39;%s%s&#39;,
  3. &#39;localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1,https://local-erp.XXX.com&#39;,
  4. Sanctum::currentApplicationUrlWithPort()
  5. ))),

kernel.php:

  1. protected $middlewareGroups = [
  2. &#39;web&#39; =&gt; [
  3. \App\Http\Middleware\EncryptCookies::class,
  4. \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
  5. \Illuminate\Session\Middleware\StartSession::class,
  6. \Illuminate\View\Middleware\ShareErrorsFromSession::class,
  7. \App\Http\Middleware\VerifyCsrfToken::class,
  8. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  9. ],
  10. &#39;api&#39; =&gt; [
  11. \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
  12. \Illuminate\Routing\Middleware\ThrottleRequests::class . &#39;:api&#39;,
  13. \Illuminate\Routing\Middleware\SubstituteBindings::class,
  14. ],
  15. ];

.env :

  1. SESSION_DOMAIN:.localhost

I also tried *.localhost, localhost

This is my LoginController :

  1. &lt;?php
  2. namespace App\Http\Controllers\Auth;
  3. use App\Http\Controllers\Controller;
  4. use App\Providers\RouteServiceProvider;
  5. use App\Service\Ldap;
  6. use Illuminate\Foundation\Auth\AuthenticatesUsers;
  7. use Illuminate\Http\Request;
  8. class LoginController extends Controller
  9. {
  10. /*
  11. |--------------------------------------------------------------------------
  12. | Login Controller
  13. |--------------------------------------------------------------------------
  14. |
  15. | This controller handles authenticating users for the application and
  16. | redirecting them to your home screen. The controller uses a trait
  17. | to conveniently provide its functionality to your applications.
  18. |
  19. */
  20. use AuthenticatesUsers;
  21. /**
  22. * Where to redirect users after login.
  23. *
  24. * @var string
  25. */
  26. protected $redirectTo = RouteServiceProvider::HOME;
  27. /**
  28. * Create a new controller instance.
  29. *
  30. * @return void
  31. */
  32. public function __construct()
  33. {
  34. $this-&gt;middleware(&#39;guest&#39;)-&gt;except(&#39;logout&#39;);
  35. }
  36. public function username()
  37. {
  38. return &#39;username&#39;;
  39. }
  40. protected function credentials(Request $request)
  41. {
  42. return [
  43. &#39;sAMAccountName&#39; =&gt; $request-&gt;username,
  44. &#39;password&#39; =&gt; $request-&gt;password
  45. ];
  46. }
  47. }

This is my queries :

  1. axios.get(&quot;https://local-erp.XXX.com/sanctum/csrf-cookie&quot;).then(response =&gt; {
  2. axios.post(&quot;https://local-erp.XXX.com/login&quot;, {username: &quot;xxx&quot;, password: &quot;xxxx&quot;})
  3. })

which returns both 204 OK Status Code.

Then when I send this :

  1. const querytest = () =&gt; {
  2. axios.get(&#39;https://local-erp.XXX.com/api/users/5/holiday-balance&#39;)
  3. }

It returns {&quot;message&quot;:&quot;Unauthenticated.&quot;}

I know there is a lot of post about this, but I tried everything I could find and nothing fixed my problem.

It might be good to know, I'm actually moving a laravel blade app into a separate spa and back application. Currently, auth worked with ldap (which must still work).

Any help would be greatly appreciated!

答案1

得分: 0

经过多次测试,我发现不可能使用不同的域名。

在我的情况下,即使我使用子域名,也不能使用相同的域名,所以我的解决方案是使用API令牌进行身份验证。
它非常有效,并被用作RESTful API。

英文:

After severals test, I found it was not possible to use different domains names.

In my case I couldn't use the same one, even if I used subdomains, so my solution was to auth with API token.
It works like a charm and is used as an RESTFUL API.

huangapple
  • 本文由 发表于 2023年7月17日 16:31:59
  • 转载请务必保留本文链接:https://go.coder-hub.com/76702700.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定