在门外,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');
});
答案 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格式提供网站时,这才有用。