Laravel: проверить, что поле соответствует определенной строке - PullRequest
0 голосов
/ 04 мая 2019

Я создаю метод регистрации для моего API с использованием паспорта.Когда пользователь регистрируется, я хочу вернуть ему токен доступа, аналогично тому, когда мы запрашиваем токен доступа.Для этого я использую грантовые пароли клиентов.

Что я сделал, так это спросил в данных регистрации client_id вдоль client_secret.

Тогда что яЯ вижу, что мои правила проверки могут подтвердить, что client_secret соответствует client_id.

Вот мой метод регистрации:

/**
 * Register a new user in the system.
 * @param \Illuminate\Http\Request $request
 * @return \Illuminate\Http\Response
 */
public function register(Request $request)
{
    $vb = User::ValidationBook();
    $data = $request->validate($vb["rules"], $vb["messages"]);

    // Neccesary data to get a token at registration
    $password = $data["user"]["password"];
    $clientId = $data["user"]["client_id"];
    $clientSecret = $data["user"]["client_secret"];

    // If validation passes, create user
    $user = $this->userService->store($data);

    $request->request->add([
        'grant_type'    => 'password',
        'client_id'     => $clientId,
        'client_secret' => $clientSecret,
        'username'      => $user->email,
        'password'      => $password,
        'scope'         => null,
    ]);

    // Fire off the internal request.
    $token = Request::create(
        'oauth/token',
        'POST'
    );
    return \Route::dispatch($token);

}

А вот версия с сокращениямимоей модели User, у меня есть все правила в методе книги проверки.

class User extends Authenticatable
{
    /**
     * Returns an array that contains two indexes:
     * 'rules' for the validation
     * 'messages' messages given by the validation
     *
     * @return array
     **/
    public static function ValidationBook($except = [], $append = [])
    {
        $book = ['rules' => [], 'messages' => []];
        $book['rules'] = [
            ... the other rules
            //Extra data for register
            'user.client_id' => 'required|exists:oauth_clients,id',
            'user.client_secret' => 'required|exists:oauth_clients,secret'
        ];
        $book['messages'] = [
            ... the other messages
            // Extras
            'user.client_id.required' => 'The client id is required',
            'user.client_secret.required' => 'The client secret is required',
        ];
        if (!empty($except)) {
            $except = array_flip($except);
            $book['rules'] = array_diff_key($book['rules'], $except);
        }
        if (!empty($append)) {
            $book = array_merge_recursive($book, $append);
        }
        return $book;
    }

}

Как я могу добавить правило к правилу user.client_secret, чтобы проверить, что секрет соответствует этому конкретному идентификатору?Возможно, это не лучший способ вернуть токен доступа после регистрации, и если есть простой способ избежать этого, я буду рад узнать об этом.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 мая 2019

Решение было простым. В моих правилах проверки к user.client_secret я добавляю следующие значения:

$book['rules'] = [
    ... the other rules
    'user.client_id' => 'required|exists:oauth_clients,id',
    'user.client_secret' => 'required|exists:oauth_clients,secret,id,'
];

В этом, рядом с проверкой существования секрета, я добавляю запрос для проверки всех записей с указанным идентификатором.

Затем перед проверкой добавляю желаемое id к правилу:

$vb = User::ValidationBook();
$vb["rules"]["user.client_secret"] .= $request->input("user")["client_id"];
$data = $request->validate($vb["rules"], $vb["messages"]);
...