Auth::attempt is only available on guards that implement the StatefulGuard trait.
The only guard Laravel ships that implements that is the SessionGuard which is available through the web middleware stack (stateful).
The idea of Sanctum is to leverage session cookies defined by a stateful login system (as the one using regular web middleare and SessionGuard) to make it easier to consume an API without the hassle of using a full stateless flow such as using Laravel Passport.
In Sanctum's docs it is clear you need to add a middleware to check session cookies in your API routes:
https://laravel.com/docs/8.x/sanctum#sanctum-middleware
This middleware is responsible for ensuring that incoming requests from your SPA can authenticate using Laravel's session cookies
Also its docs states you should use your traditional login system:
Once CSRF protection has been initialized, you should make a POST request to the typical Laravel /login route. This /login route may be provided by the laravel/jetstream authentication scaffolding package.
Reference: https://laravel.com/docs/8.x/sanctum#spa-authenticating
Two important things here:
1 - You need to use traditional session/cookie-based login. (implied here "...you should make a POST request to the typical Laravel /login route.)
2- You don't need to use Fortify/JetStream for that. Note here: "... This /login route may be provided by the laravel/jetstream ... docs states the login route may be provided, not that is should be provided.
Bottom line:
1 - Username/Password login should be done using traditional cookie-based login.
If you don't want to use Fortify/Jetstream you can still use laravel/ui, it is still support and fits your needs, as per this package readme:
This project is a very simple authentication scaffolding ...
https://github.com/laravel/ui/blob/3.x/README.md
If you still don't want to use that, you can implement the login using SessionGuard following the docs instructions here:
https://laravel.com/docs/8.x/authentication#authenticating-users
2 - Use Sanctum afterwards to easily consume your API from your SPA in the same domain relying on cookies set by your session based authentication.
Don't forget to refresh the CSRF token on your SPA as outlined here:
https://laravel.com/docs/8.x/sanctum#spa-authenticating
3 - If you need third-party applications to consume your API, then you can issue tokens for those.
Sanctum first-party SPAs are meant to use leverage cookies for easy API consumption.
Hope it helps.