我正在使用Laravel 7和laravel护照8.4。我可以登录并返回访问令牌,但是当我尝试获取用户详细信息时,我遇到了未经授权的401。我正在使用带有laravel护照密码客户端的vue js。
这是我的用户模型
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable implements MustVerifyEmail
{
use HasApiTokens, Notifiable, SoftDeletes ;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password','phone_number','date_of_registration'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
}
这是我的AuthServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;
use Carbon\Carbon;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(Carbon::now()->addMinutes(5));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(10));
}
}
这是我的config / auth.php
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Defaults
|--------------------------------------------------------------------------
|
| This option controls the default authentication "guard" and password
| reset options for your application. You may change these defaults
| as required, but they're a perfect start for most applications.
|
*/
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
/*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| Next, you may define every authentication guard for your application.
| Of course, a great default configuration has been defined for you
| here which uses session storage and the Eloquent user provider.
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| Supported: "session", "token"
|
*/
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
//'hash' => false,
],
],
/*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| If you have multiple user tables or models you may configure multiple
| sources which represent each model / table. These sources may then
| be assigned to any extra authentication guards you have defined.
|
| Supported: "database", "eloquent"
|
*/
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
/*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
|
| The expire time is the number of minutes that the reset token should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],
/*
|--------------------------------------------------------------------------
| Password Confirmation Timeout
|--------------------------------------------------------------------------
|
| Here you may define the amount of seconds before a password confirmation
| times out and the user is prompted to re-enter their password via the
| confirmation screen. By default, the timeout lasts for three hours.
|
*/
'password_timeout' => 10800,
];
这是我的config / app.php
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
|
*/
'name' => env('APP_NAME', 'Events'),
/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services the application utilizes. Set this in your ".env" file.
|
*/
'env' => env('APP_ENV', 'production'),
/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/
'debug' => (bool) env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
|
*/
'url' => env('APP_URL', 'http://localhost'),
'asset_url' => env('ASSET_URL', null),
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'UTC',
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
'faker_locale' => 'en_US',
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is used by the Illuminate encrypter service and should be set
| to a random, 32 character string, otherwise these encrypted strings
| will not be safe. Please do this before deploying an application!
|
*/
'key' => env('APP_KEY'),
'cipher' => 'AES-256-CBC',
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Package Service Providers...
*/
//Auth0\Login\LoginServiceProvider::class,
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
Laravel\Passport\PassportServiceProvider::class,
],
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
'Bus' => Illuminate\Support\Facades\Bus::class,
'Cache' => Illuminate\Support\Facades\Cache::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
'Event' => Illuminate\Support\Facades\Event::class,
'File' => Illuminate\Support\Facades\File::class,
'Gate' => Illuminate\Support\Facades\Gate::class,
'Hash' => Illuminate\Support\Facades\Hash::class,
'Http' => Illuminate\Support\Facades\Http::class,
'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class,
'Notification' => Illuminate\Support\Facades\Notification::class,
'Password' => Illuminate\Support\Facades\Password::class,
'Queue' => Illuminate\Support\Facades\Queue::class,
'Redirect' => Illuminate\Support\Facades\Redirect::class,
'Redis' => Illuminate\Support\Facades\Redis::class,
'Request' => Illuminate\Support\Facades\Request::class,
'Response' => Illuminate\Support\Facades\Response::class,
'Route' => Illuminate\Support\Facades\Route::class,
'Schema' => Illuminate\Support\Facades\Schema::class,
'Session' => Illuminate\Support\Facades\Session::class,
'Storage' => Illuminate\Support\Facades\Storage::class,
'Str' => Illuminate\Support\Str::class,
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
'Auth0' => Auth0\Login\Facade\Auth0::class,
],
];
api.php
//Protected routes
Route::middleware('auth:api')->group(function(){
Route::get('/user', 'AuthController@getDetails');
Route::post('logout', 'AuthController@logout')->name('logout');
});
当我登录时,它会返回
{"JSON":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiOGVjNDU4MDNkMTc4MzJmMjkxNTIzMWEwY2FmMzNiYjU2ODA3OTljYzBiNGU1NGI4Y2NiNDEyMTQ0MzIxOTcwYjhiNzhiNWE3NmQwMDY3MTAiLCJpYXQiOjE1ODczMDIxMTQsIm5iZiI6MTU4NzMwMjExNCwiZXhwIjoxNTg3MzAyNDEyLCJzdWIiOiIzIiwic2NvcGVzIjpbIioiXX0.Lyr1pW8ec4XO-TXxv7Pqc06gLUOGJmaVRcr7lQDCzaaknWVyr-C8zQd67GyYBrLKpduvZQ-1nCUGpJNqQ54p3IXbTG1UXrFy1ytFXcnpl6ZNxCMoENcbzg_skRLr7Mf1yRI5A0QEqx0NBGrmcBhcd2R7QOUsdYQZiIT9xhHgSOlN2IEmrQRdRSJ3SSeNcecf5zn_EpznkzbQP9viUkZ-cOg5DyX_4LkrCS1xY52cVhzhlp2jZS0hnSXYX_SetBAzg_Q_Hq_v7b6b3SXsFQfyVp96moJKK1w3ukk-DKWxM75c9zjbRL-zeAqaKUMF9duzSEUfr4inIazADRdax9mn371EtW4wKLVWSJFLXCqD6bc6h2cc42v_Suoz__R5Vp8vWNNx8EdFhnXwhhUb-Ks2k_8dqNHccp40gPznQVxNQjluLVfP8_7qJUv8oSjy1E1Xl2T9L4BCTq8LHWEglDbWjX3v72BFvaMBT8nLZUNaGj-DAvqtriOuzRmGrbULz-WE1Ng_Bb6IyTwD-V3wSzzqapYLTj9r2O36mUmJB6zcDQgy7KKo54Po3OBY4oZwDkbhFmii1_eBtOGzkoTc0NRHYwzJe7cR8iB0D5wBI9kWmuSehyTTN4JoYecfF_wDrzSdBKLhg7lW421-XHsCHxRddaqkaiG-l3yPH98ZJaEVoxE","expiresIn":298,"message":"Login successful"},"Response Payload":{"EDITOR_CONFIG":{"text":"{\"token\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiOGVjNDU4MDNkMTc4MzJmMjkxNTIzMWEwY2FmMzNiYjU2ODA3OTljYzBiNGU1NGI4Y2NiNDEyMTQ0MzIxOTcwYjhiNzhiNWE3NmQwMDY3MTAiLCJpYXQiOjE1ODczMDIxMTQsIm5iZiI6MTU4NzMwMjExNCwiZXhwIjoxNTg3MzAyNDEyLCJzdWIiOiIzIiwic2NvcGVzIjpbIioiXX0.Lyr1pW8ec4XO-TXxv7Pqc06gLUOGJmaVRcr7lQDCzaaknWVyr-C8zQd67GyYBrLKpduvZQ-1nCUGpJNqQ54p3IXbTG1UXrFy1ytFXcnpl6ZNxCMoENcbzg_skRLr7Mf1yRI5A0QEqx0NBGrmcBhcd2R7QOUsdYQZiIT9xhHgSOlN2IEmrQRdRSJ3SSeNcecf5zn_EpznkzbQP9viUkZ-cOg5DyX_4LkrCS1xY52cVhzhlp2jZS0hnSXYX_SetBAzg_Q_Hq_v7b6b3SXsFQfyVp96moJKK1w3ukk-DKWxM75c9zjbRL-zeAqaKUMF9duzSEUfr4inIazADRdax9mn371EtW4wKLVWSJFLXCqD6bc6h2cc42v_Suoz__R5Vp8vWNNx8EdFhnXwhhUb-Ks2k_8dqNHccp40gPznQVxNQjluLVfP8_7qJUv8oSjy1E1Xl2T9L4BCTq8LHWEglDbWjX3v72BFvaMBT8nLZUNaGj-DAvqtriOuzRmGrbULz-WE1Ng_Bb6IyTwD-V3wSzzqapYLTj9r2O36mUmJB6zcDQgy7KKo54Po3OBY4oZwDkbhFmii1_eBtOGzkoTc0NRHYwzJe7cR8iB0D5wBI9kWmuSehyTTN4JoYecfF_wDrzSdBKLhg7lW421-XHsCHxRddaqkaiG-l3yPH98ZJaEVoxE\",\"expiresIn\":298,\"message\":\"Login successful\"}","mode":"application/json"}}}
这是我的dashboardComponent.vue,我试图在其中检索当前登录的用户
methods: {
async fetchData () {
const tk = this.isLoggedIn;
this.error = this.post = null
this.loading = true
let authOptions = {
method: 'GET',
url: '/user',
data: [],
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': `Bearer ${tk}`
},
json: true
};
console.log(authOptions);
//return false;
await this.$axios(authOptions).then(response => {
console.log(response);
//this.$store.commit('setCurrentUser', user.user)
})
},
}
上面组件中的console.log返回此
{…}
data: Array []
headers: Object { Accept: "application/json", "Content-Type": "application/json", Authorization: "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiOGVjNDU4MDNkMTc4MzJmMjkxNTIzMWEwY2FmMzNiYjU2ODA3OTljYzBiNGU1NGI4Y2NiNDEyMTQ0MzIxOTcwYjhiNzhiNWE3NmQwMDY3MTAiLCJpYXQiOjE1ODczMDIxMTQsIm5iZiI6MTU4NzMwMjExNCwiZXhwIjoxNTg3MzAyNDEyLCJzdWIiOiIzIiwic2NvcGVzIjpbIioiXX0.Lyr1pW8ec4XO-TXxv7Pqc06gLUOGJmaVRcr7lQDCzaaknWVyr-C8zQd67GyYBrLKpduvZQ-1nCUGpJNqQ54p3IXbTG1UXrFy1ytFXcnpl6ZNxCMoENcbzg_skRLr7Mf1yRI5A0QEqx0NBGrmcBhcd2R7QOUsdYQZiIT9xhHgSOlN2IEmrQRdRSJ3SSeNcecf5zn_EpznkzbQP9viUkZ-cOg5DyX_4LkrCS1xY52cVhzhlp2jZS0hnSXYX_SetBAzg_Q_Hq_v7b6b3SXsFQfyVp96moJKK1w3ukk-DKWxM75c9zjbRL-zeAqaKUMF9duzSEUfr4inIazADRdax9mn371EtW4wKLVWSJFLXCqD6bc6h2cc42v_Suoz__R5Vp8vWNNx8EdFhnXwhhUb-Ks2k_8dqNHccp40gPznQVxNQjluLVfP8_7qJUv8oSjy1E1Xl2T9L4BCTq8LHWEglDbWjX3v72BFvaMBT8nLZUNaGj-DAvqtriOuzRmGrbULz-WE1Ng_Bb6IyTwD-V3wSzzqapYLTj9r2O36mUmJB6zcDQgy7KKo54Po3OBY4oZwDkbhFmii1_eBtOGzkoTc0NRHYwzJe7cR8iB0D5wBI9kWmuSehyTTN4JoYecfF_wDrzSdBKLhg7lW421-XHsCHxRddaqkaiG-l3yPH98ZJaEVoxE" }
json: true
method: "GET"
url: "/user"