Регистрация пользователя с паспортом Laravel
Я настроил предоставление пароля (это бэкэнд для приложения). Теперь я могу отправить запрос на почту в oauth/token
, и он работает на Почтальоне. Но что, если я тоже хочу зарегистрировать пользователя из API?
Я понимаю, что могу использовать текущий маршрут /register
, однако тогда мне нужно будет перенаправить пользователя обратно на страницу входа, и он снова войдет со своими учетными данными?
Или в RegisterController, в функции registered()
, я должен перенаправить на маршрут oauth/token
? (Для этого, пожалуйста, обратите внимание, что я отправляю все 5 данных в 'x-www-form-urlencoded', и это, похоже, работает. Однако нужно ли разделять некоторые данные в заголовках? Это размыто для меня, так что просто хотелось спросить, когда у меня есть возможность).
Или я должен добавить что-то в метод oauth/token
, например, этот парень? На самом деле я пытался поймать опубликованные данные $request
о методе [email protected]
внутри библиотеки, однако я не мог понять, как манипулировать массивом parsedBody
. Если я активирую свою функцию регистрации из реальной библиотеки, как я узнаю, зарегистрировалась ли она или вошла?
Может быть, я упускаю какую-то информацию, но я не смог найти ничего по этой теме. Как правильно обрабатывать регистрацию пользователя в паспорте?
Обновление: Принятый ответ показывает цикл "регистрация"; и под ним я добавил реализации 'login' и 'refresh token'. Надеюсь, это поможет :)
Ответы
Ответ 1
В вашем API создайте маршрут как
Route::post('register','Api\[email protected]');
И в методе UserController create create()
function create(Request $request)
{
/**
* Get a validator for an incoming registration request.
*
* @param array $request
* @return \Illuminate\Contracts\Validation\Validator
*/
$valid = validator($request->only('email', 'name', 'password','mobile'), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6',
'mobile' => 'required',
]);
if ($valid->fails()) {
$jsonError=response()->json($valid->errors()->all(), 400);
return \Response::json($jsonError);
}
$data = request()->only('email','name','password','mobile');
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'mobile' => $data['mobile']
]);
// And created user until here.
$client = Client::where('password_client', 1)->first();
// Is this $request the same request? I mean Request $request? Then wouldn't it mess the other $request stuff? Also how did you pass it on the $request in $proxy? Wouldn't Request::create() just create a new thing?
$request->request->add([
'grant_type' => 'password',
'client_id' => $client->id,
'client_secret' => $client->secret,
'username' => $data['email'],
'password' => $data['password'],
'scope' => null,
]);
// Fire off the internal request.
$token = Request::create(
'oauth/token',
'POST'
);
return \Route::dispatch($token);
}
И после создания нового пользователя, введите токен доступа.
Ответ 2
И через год я понял, как реализовать полный цикл.
Метод @Nileshsinh показывает цикл регистров.
И вот логин и обновление частей токена:
Route::post('auth/token', 'Api\[email protected]');
Route::post('auth/refresh', 'Api\[email protected]');
Методы:
class AuthController extends Controller
{
private $client;
/**
* DefaultController constructor.
*/
public function __construct()
{
$this->client = DB::table('oauth_clients')->where('id', 1)->first();
}
/**
* @param Request $request
* @return mixed
*/
protected function authenticate(Request $request)
{
$request->request->add([
'grant_type' => 'password',
'username' => $request->email,
'password' => $request->password,
'client_id' => $this->client->id,
'client_secret' => $this->client->secret,
'scope' => ''
]);
$proxy = Request::create(
'oauth/token',
'POST'
);
return \Route::dispatch($proxy);
}
/**
* @param Request $request
* @return mixed
*/
protected function refreshToken(Request $request)
{
$request->request->add([
'grant_type' => 'refresh_token',
'refresh_token' => $request->refresh_token,
'client_id' => $this->client->id,
'client_secret' => $this->client->secret,
'scope' => ''
]);
$proxy = Request::create(
'oauth/token',
'POST'
);
return \Route::dispatch($proxy);
}
}
Ответ 3
Читая это, в то время как Laravel 6 был недавно развернут, мое решение для этого заключается в следующем.
Если вы выполнили шаги, определенные в паспортной документации LaRavel passport documentation, и добавили черту HasApiTokens
в модель User
, вы можете вызвать функцию createToken
для ваших пользовательских сущностей.
Кроме того, в вашем RegisterController
есть функция registered
из черты RegistersUsers
, которую вы можете реализовать, которая вызывается, когда пользователь успешно зарегистрирован. Таким образом, вы можете реализовать это следующим образом:
protected function registered(Request $request, User $user)
{
$token = $user->createToken('tokenName');
return response()->json([
'user' => $user,
'token' => $token->accessToken,
]);
}
См. функцию register
в признаке RegistersUsers
для получения дополнительной информации о цикле регистрации.