因此,将我的应用程序视为CMS(laravel 5.7)。我正在慢慢添加更多的JavaScript,以使其更具反应性。因此,我具有通常的验证逻辑,可确保用户已登录并完成所有操作。但是现在,当我使用Vue提交评论有效内容时,它看起来像这样:
因此,任何人都可以将this.user.id更改/模拟为任何数字,我还要发送一个带有有效负载的登录令牌,一旦服务器收到发布请求,该令牌便会在后端得到验证
在后端,理想情况下,我想使用某种安全防护措施,检查用户的api_token是否与此this.user.id匹配,以确保不会在前端嘲笑user.id。
我阅读了这一部分:https://laravel.com/docs/5.7/passport#consuming-your-api-with-javascript
其中一部分说:
此Passport中间件会将laravel_token cookie附加到您的外发响应中。此cookie包含一个加密的JWT,Passport将使用该JWT来验证来自JavaScript应用程序的API请求。现在,您可以在不显式传递访问令牌的情况下向应用程序的API发出请求:
但是我仍然不确定首先如何生成JWT。我没有为create token crud添加vue组件,因为我希望它可以自动完成。我想我对此有点过思。
这是Laravel Passport的好用例吗?我一直在浏览本教程,现在不需要自定义oauth令牌创建以及所有原始操作。我只希望将唯一的令牌保存在用户端,该令牌可以过期,但也可以用于验证请求。我在Passport上走的路是正确的还是应该使用其他方法?
postComment(){
axios.post('/api/view/' + this.query.id+'/comment',{
id: this.user.id,
body: this.commentBox
})
.then((response) =>{
//Unshift places data to top of array, shifts everything else down.
this.comments.unshift(response.data);
this.commentBox = '';
document.getElementById("commentBox").value = "";
flash
('Comment posted successfully');
})
.catch((error) => {
console.log(error);
})
},
更新-回复Jeff
嗨!感谢您的回答。它不是SPA(可能会在将来),但是注释框和注释部分也与websocket集成在一起,并且上面有一个laravel Echo实例。
我想我感到不确定的是它的安全性。
我将带有:user="{{Auth::check() ? Auth::user()->toJson() : 'null'}}"
的用户道具传递到包含postComment()
函数的vue组件中。
这是id: this.user.id
的来源。路由在路由中间件组的api.php中为['api']定义,如下所示:
Route::group(['middleware' => ['api']], function(){
Route::post('/view/{query}/comment','CommentController@store');
});
在我的调用服务以创建评论的控制器中,$ request
public function makejson(createNewCommentRequest $request, Query $query){
$comment = $query->comments()->create([
'body' => $request->get('body'),
])->user()->associate(User::find($request->id));
$id = $comment->id;
$comment->save();
}
createNewCommentRequest是一个FormRequest类。
目前,authorize()函数仅检查request()-> id是否为整数:
public function authorize()
{
if(is_int(request()->id)){
return true;
}
return false;
}
如果我在其中记录了request(),则输出的全部是:
array ( 'id' => 1, 'body' => 'gg', )
我认为我需要添加逻辑以根据用户令牌和request()是否产生相同的用户ID来授权请求?我想避免有人可以使用其他用户ID修改发布请求和发表评论的情况。
在devtools的Network部分的Request标头中,我看到它推送了一个laravel_token cookie。我假设laravel_token
是存储用户会话的内容?如果是这样,一个人如何根据该令牌进行验证?
我正在玩耍并添加了路线:
Route::get('/token', function() {
return Auth::user()->createToken('test');
});
当我去的时候,我得到了以下内容:
{
"accessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImE4NDE2NGVkM2NkODc5NDY3MzAxYzUyNmVkN2MyMGViZTllNzJlMGMzMjRiMmExNWYzZDgwZGNmMzEzMDk1MTRmNTY1NGMxYWUwMTE2ZGRkIn0.eyJhdWQiOiIxIiwianRpIjoiYTg0MTY0ZWQzY2Q4Nzk0NjczMDFjNTI2ZWQ3YzIwZWJlOWU3MmUwYzMyNGIyYTE1ZjNkODBkY2YzMTMwOTUxNGY1NjU0YzFhZTAxMTZkZGQiLCJpYXQiOjE1NDY1NTQzNDEsIm5iZiI6MTU0NjU1NDM0MSwiZXhwIjoxNTc4MDkwMzQwLCJzdWIiOiIxIiwic2NvcGVzIjpbXX0.NMETCBkOrMQGUsXlcas6CvTFJ0xRC8v4AJzC5GtWANdl8YsPBGlyCozMe1OGc8Fnq8GC_GZFkKmMT27umeVcSyaWriZB139kvtWzY6ylZ300vfa5iI-4XC_tJKoyuwDEofqMLDA4nyrtMrp_9YGqPcg6ddR61BLqdvfr0y3Nm5WWkyMqBzjKV-HFyuR0PyPQbnLtQGCzRFUQWbV4XWvH2rDgeI71S6EwmjP7J1aDA2UBVprGqNXdTbxWpSINMkZcgrDvl4hdqNzet-OwB2lu2453R-xKiJkl8ezwEqkURwMj70G-t9NjQGIBInoZ-d3gM2C3J9mEWMB5lyfSMaKzhrsnObgEHcotORw6jWNsDgRUxIipJrSJJ0OLx29LHBjkZWIWIrtsMClCGtLXURBzkP-Oc-O9Xa38m8m6O9z-P8i6craikAIckv9YutmYHIXCAFQN2cAe2mmKp7ds1--HWN_P5qqw6ytuR268_MbexxGDTyq8KzUYRBjtkgVyhuVsS7lDgUHgXvJfHNmdCulpiPhmbtviPfWaZM19likSjKHLTpIn2PpfTflddfhB9Eb4X24wGH7Y5hwxASe7gDs_R707LphS1EH4cTE8p2XW_lLv0jo89ep9IUPUO27pWLsqabt8uTr5OoKQeNZmXT6XiJ9tK3HhRgvIt7DYt8vqlRw",
"token": {
"id": "a84164ed3cd879467301c526ed7c20ebe9e72e0c324b2a15f3d80dcf31309514f5654c1ae0116ddd",
"user_id": 1,
"client_id": 1,
"name": "lol",
"scopes": [],
"revoked": false,
"created_at": "2019-01-03 22:25:40",
"updated_at": "2019-01-03 22:25:40",
"expires_at": "2020-01-03 22:25:40"
}
}
现在邮递员中,当我向以下地点发送获取请求时
:Route::middleware('auth:api')->get('/user', function (Request $request){return $request->user();});
我为变量accessToken
中捕获的字符串添加了Bearer Token类型的授权标头。作为回报,我得到了用户,没有问题。但是,在何处以及如何生成accessToken?它没有保存在数据库中吗?
答案 0 :(得分:0)
从令牌中获取Laravel为您提供的用户ID,而不是从前端发送。您还可以检查分配给令牌的范围:
Route::post('/api/view/{query}/comment', function (Request $request, Query $query) {
if ($request->user()->tokenCan('comment-on-queries')) {
$query->comments()->create([
'body' => $request->get('body'),
'user_id' => $request->user()->id,
]);
}
});
如果这不是单个页面的应用程序,并且只有注释框由ajax处理,则默认的Laravel脚手架应通过向axios配置添加CSRF令牌来处理此问题。在那种情况下,您不需要Passport,因为用户存储在会话中。不过,请不要从前端获取用户ID,而应从\Auth::id()
主要区别在于:如果他们使用PHP登录,则您的服务器存储了一个会话,并且知道谁登录。
如果要创建与Laravel应用分开的单页应用,则必须依靠Passport和令牌来确保用户有权执行他们想做的事情。
答案 1 :(得分:0)
弄清楚了,想得太深了。基本上不需要很多东西就能使它工作。
然后可以通过很棒的request()-> user()调用用户实例。