基于令牌的身份验证Laravel 5.5

时间:2017-09-27 15:31:39

标签: laravel vue.js

在门外,Laravel的auth配置为用户指定了基于令牌的身份验证方法:

'guards' => [
    'web' => [
        'driver'   => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver'   => 'token',
        'provider' => 'users',
    ],
],

我想要保护一些ajax端点,因此我的应用程序之外的任何人都无法与它们进行交互。我看过Passport,但考虑到这种身份验证配置,我似乎并不需要它。 如何利用此令牌保护我的ajax端点,如果可能,请确定请求所属的用户?

目前我的api.php路线文件如下:

//Route::middleware('auth:api')->group(function () {
    Route::post('subscribe', 'SubscriptionController@create');
    Route::post('unsubscribe', 'SubscriptionController@delete');
//});

我认为Laravel可能已经为VueJS实现处理了auth或其他东西,但它看起来并不像。我的ajax请求如下:

this.$http.post('/api/subscribe', {
    subscribed_by: currentUser,
    game_id: this.gameId,
    guild_discord_id: this.guildDiscordId,
    channel_id: newChannelId,
    interests: this.interests.split(',')
}).then(response => {
    // success
}, response => {
    console.error('Failed to subscribe');
});

2 个答案:

答案 0 :(得分:0)

正如Maraboc已经说过的那样,您应该首先在$table->string('api_token', 60)->unique();表格中创建一个列api_token:users

确保每个新创建的用户都获得一个分配的令牌,并加密它:$user->api_token = encrypt(str_random(60));

接下来,您可以在应用的页脚中定义一个Javascript变量:

window.Laravel = <?php echo json_encode([
    'apiToken' => !empty(Auth::user()) ? decrypt(Auth::user()->api_token) : ''
]); ?>;

稍后,当您想要向端点发出请求时,您应该添加一个标头,授权该用户:

let url = '/path/to/your-endpoint.json';
let data = {
    headers: {
        'Authorization': 'Bearer ' + Laravel.apiToken
    }
};

axios.get(url, data)
    .then(response => console.dir(response));

最后,在您的控制器中,您可以使用Laravel的guard来获取您的用户实例:

$user = !empty(Auth::guard('api')->user()) ? Auth::guard('api')->user() : null;

希望这有帮助!顺便说一句:这些文章帮助了我:

答案 1 :(得分:0)

我采取的解决方案是不将ajax端点放在api命名空间中。通过将它们设置为web路由而不是api,它将使用CSRF(跨站点请求伪造)保护来验证路由。因此,只有来自我的域名才会进行身份验证。只有在以https格式提供网站时,这才有用。

相关问题