Регистрация пользователя с паспортом 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 для получения дополнительной информации о цикле регистрации.