Это правильный вариант использования Laravel Passport? - PullRequest
0 голосов
/ 03 января 2019

Так что думайте о моем приложении как о 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? Это не сохраняется в базе данных?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Разобрался, переосмыслил. По сути, не нужно было много, чтобы это заработало.

  • В веб-группу app \ Http \ Kernel.php добавлено промежуточное программное обеспечение CreateFreshApiToken.
  • Ответы axios прикрепляют этот файл cookie к исходящим ответам
  • Группа промежуточного программного обеспечения API должна быть 'auth: api'.

Пользовательский экземпляр затем может быть вызван через request () -> user (), что просто здорово.

0 голосов
/ 04 января 2019

Возьмите идентификатор пользователя, который Laravel дает вам из токена, вместо того, чтобы отправлять его из внешнего интерфейса. Вы также можете проверить области действия, назначенные токену:

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 должны справиться с этим, добавив токен CSRF в конфигурацию axios. В этом случае вам не нужен паспорт, потому что пользователь хранится в сеансе. Тем не менее, не берите ID пользователя из внешнего интерфейса, получите его от \Auth::id()

Вот ключевое отличие: если они входят в систему с использованием PHP, на вашем сервере сохраняется сеанс и он знает, кто вошел в систему.

Если вы создаете одностраничное приложение, отдельное от вашего приложения Laravel, вы должны полагаться на Паспорт и токены, чтобы гарантировать, что пользователь имеет полномочия делать то, что он пытается сделать.

...