Я создал бэкэнд Laravel с API. Кроме того, я добавил паспорт Laravel для аутентификации.
Сейчас я хочу получить доступ к API через приложение ReactJS Frontend и приложение React-Native. Приложение ReactJS находится на том же сервере, что и серверная часть Laravel.
Теперь я ищу лучший способ соединить все с лучшей безопасностью.
Я искал и проверял учебники, HowTos, ... уже более недели, и я не знаю, что лучше.
Прямо сейчас моя «установка» из-за некоторых потоков и тому подобного:
Я проверил документацию Laravel и несколько HowTos и внедрил Password Grant Client
в своем приложении:
public function login(Request $request){
$http = new GuzzleHttp\Client;
$response = $http->post(env('APP_URL') . '/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => env('PASSWORD_CLIENT_ID'),
'client_secret' => env('PASSWORD_CLIENT_SECRET'),
'username' => $request->input('email'),
'password' => $request->input('password'),
'scope' => '',
],
]);
$responseJSON = json_decode($response->getBody(), true);
$output = array(
'access_token' => $responseJSON['access_token'],
'expires_in' => $responseJSON['expires_in']
);
return response($output)
->header('Content-Type', 'application/json')
->cookie('refreshToken', $responseJSON['refresh_token'], 14400, null, null, true, true);
}
и для обновления токена:
public function tryRefresh(Request $request) {
$http = new GuzzleHttp\Client;
$refreshToken = $request->cookie('refreshToken');
$response = $http->post(env('APP_URL') . '/oauth/token', [
'form_params' => [
'grant_type' => 'refresh_token',
'refresh_token' => $refreshToken,
'client_id' => env('PASSWORD_CLIENT_ID'),
'client_secret' => env('PASSWORD_CLIENT_SECRET'),
'scope' => '',
],
]);
$responseJSON = json_decode($response->getBody(), true);
$output = array(
'access_token' => $responseJSON['access_token'],
'expires_in' => $responseJSON['expires_in']
);
return response($output)
->header('Content-Type', 'application/json')
->cookie('refreshToken', $responseJSON['refresh_token'], 14400, null, null, true, true);
}
Токен доступа установлен на 30 минут, а токен обновления - на 10 дней.
Все работает, но я не знаю, хорошая ли это практика, потому что:
- Я прочитал, что приложения JS не могут безопасно сохранить токен доступа
- Жетон обновления не должен сохраняться в куки
- Laravel предоставляет что-то для JS Frontends
- (и // или) Для использования API в качестве стороннего приложения эта процедура не требуется
Таким образом, мой вопрос: что является хорошим / лучшим методом для моего типа использования, поэтому аутентификация безопасна и работает как на веб-приложении ReactJs, так и на мобильном приложении React-Native.