Well, Oauth is exactly what you need here ;)
Laravel Passport comes by default with some frontend components which do exactly what you want. The user can login, and they can create their own access tokens in there. You can steal the code from those components to set it up using controller code instead of the commands. All the classes are available, you just need to know where to look.
Oauth2 in this case, can be used in two different ways. With a single access token (the above way) or you can use a full fletched client/secret and access token with refresh token way. This is all supported by Laravel Passport out of the box but you need to set it up yourself for the biggest part. Again, you need to know where to look.
If you have a misunderstanding of how OAuth works, I recommend you to read this: https://oauth2.thephpleague.com/authorization-server/which-grant/ Laravel Passport is built on this package.
The Laravel Passport documentation also shows some glimpse of how you can use these more advanced Oauth2 approaches: https://laravel.com/docs/8.x/passport#code-grant-pkce
However, the documentation assumes that you use the build-in components that come with the package. If you don't, you have to create those components yourself.