Так что думайте о моем приложении как о 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
Часть этого говорит:
Это промежуточное программное обеспечение для паспорта прикрепит файл cookie laravel_token к вашим исходящим ответам. Этот файл cookie содержит зашифрованный JWT, который Passport будет использовать для аутентификации запросов API из вашего приложения JavaScript. Теперь вы можете делать запросы к API вашего приложения без явной передачи токена доступа:
Но я все еще немного неуверен, как этот JWT генерируется в первую очередь. У меня нет добавленных компонентов vue для create token crud, потому что я хочу, чтобы это делалось автоматически. Я думаю, что немного обдумываю это ..
Это хороший вариант использования Laravel 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);
})
},
Обновление - ответ Джеффу
Привет! Спасибо за Ваш ответ. Это не SPA (может быть в будущем), но поле для комментариев и раздел для комментариев также интегрированы с веб-сокетами, и на них есть экземпляр Echo laravel.
Полагаю, в этом я чувствую себя неуверенно.
Я передаю пользовательский реквизит с :user="{{Auth::check() ? Auth::user()->toJson() : 'null'}}"
в компонент vue, который содержит функцию postComment()
.
Отсюда и 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;
}
Изнутри, если я регистрирую запрос (), все, что он выводит:
array ( 'id' => 1, 'body' => 'gg', )
Я подумал, что мне нужно будет добавить логику для авторизации запроса, основываясь на том, дают ли токен пользователя и request () один и тот же идентификатор пользователя? Я бы хотел избежать сценария, когда кто-то может изменить запрос на публикацию и комментарий, используя идентификатор другого пользователя.
В разделе «Сеть» devtools, в заголовках запросов, я вижу, что он выдал cookie laravel_token. Я предполагаю, что 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();});
Я добавил заголовок авторизации типа Bearer Token для строки, захваченной в переменной: accessToken
. В ответ я получаю пользователя, без проблем. Однако где и как генерируется accessToken? Это не сохраняется в базе данных?