Laravel 5.3 и паспорт. Попытка создать единого клиента для API

Я пытаюсь создать API, который обслуживает мобильное приложение. Я использую Laravel 5.3 с паспортом.

Сам поток такой. Мобильное приложение предоставит API токен доступа к Facebook, который будет использоваться для сбора некоторой информации о пользователе (идентификатор Facebook, имя, изображение профиля и электронная почта). В этот момент сервер вставит, если он еще не существует, информацию выше в таблицу пользователей, создавая, в основном, нового пользователя. Обратите внимание, что нигде сервер бэкэнда никуда не входит, поскольку маркер доступа уже предоставлен мобильным приложением.

После этого сервер должен предоставить маркер доступа к мобильному приложению, которое будет использоваться для доступа к другим маршрутам из самого API. Это должно быть сделано через паспорт. Насколько я могу сказать через Passport, новый клиент должен быть создан для каждого пользователя, но я не ищу этого, так как мобильное приложение является единственным «клиентом», который будет иметь API. Пользователи, созданные через Facebook, на самом деле являются пользователями мобильного приложения, а не самим API. Схема для oauth_clients является:

CREATE TABLE `oauth_clients` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`secret` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`redirect` text COLLATE utf8_unicode_ci NOT NULL,
`personal_access_client` tinyint(1) NOT NULL,
`password_client` tinyint(1) NOT NULL,
`revoked` tinyint(1) NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `oauth_clients_user_id_index` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Я не изменял это ни в коем случае, это схема по умолчанию.

Что не имеет смысла для моих потребностей, я не хочу кучу клиентов, я хочу только одного клиента. Само мобильное приложение.

Я, конечно, мог бы создать пользователя только для самого мобильного приложения, и пользователям Facebook всегда будет назначено мобильное приложение. user_id в oauth_clients стол, но это только кажется неправильным.

1

Решение

Проблема с паспортом Laravel 5.3 заключается в том, что в отличие от предыдущей библиотеки OAuth 2.0 Server для Laravel, предлагаемой lucadegasperi, у нее нет API для непосредственного создания клиентов. Так как будто теперь клиент может быть сделан только через интерфейс. К вашему сведению, мы хотели использовать паспорт laravel исключительно для нашего мобильного приложения, поэтому при создании и регистрации пользователя у нас будет только EMAIL & Пароль, а в некоторых случаях только Facebook UserID.

  1. в oauth_clients преобразуйте поле id в обычное поле, то есть удалите его как первичный ключ и сделайте тип данных как varchar, чтобы мы могли хранить адрес электронной почты как client_ids, поскольку они также уникальны для вашей системы. В случае входа в Facebook мы храним здесь идентификаторы пользователей Facebook, которые также будут уникальными для каждого нашего клиента. Также для других таблиц, таких как: oauth_access_tokens, oauth_auth_codes & oauth_personal_access_clients измените client_id на VARCHAR (255), чтобы он мог хранить адреса электронной почты или идентификаторы пользователей Facebook.

  2. Теперь перейдите к своим моделям и создайте модель для таблицы oauth_clients, чтобы вы могли прагматично создавать клиента из кода при создании пользователей.

    <?php
    namespace App;use Illuminate\Database\Eloquent\Model;
    
    class oAuthClient extends Model
    {
    
    protected $table = 'oauth_clients';
    
    }
    
  3. Затем вы добавляете в свой маршрутный файл api.php следующий маршрут:

    Route::post('/register-user', function () {
    
    $email= \Illuminate\Support\Facades\Input::get('email');
    $password=\Illuminate\Support\Facades\Input::get('password');
    
    $user = new \App\User(array(
    'name' =>\Illuminate\Support\Facades\Input::get('name'),
    'email' => \Illuminate\Support\Facades\Input::get('email'),
    'password' => bcrypt(\Illuminate\Support\Facades\Input::get('password')),
    ));
    $user->save();
    
    $oauth_client=new \App\oAuthClient();
    $oauth_client->user_id=$user->id;
    $oauth_client->id=$email;
    $oauth_client->name=$user->name;
    $oauth_client->secret=base64_encode(hash_hmac('sha256',$password, 'secret', true));
    $oauth_client->password_client=1;
    $oauth_client->personal_access_client=0;
    $oauth_client->redirect='';
    $oauth_client->revoked=0;
    $oauth_client->save();
    
    return [
    'message' => 'user successfully created.'
    ];
    });
    

В приведенном выше фрагменте кода вы должны заметить, что для генерации секрета oauth_client вы должны использовать строгую формулу шифрования, которую вам удобно использовать с вашим приложением. Также используйте ту же технику для генерации секретного ключа в вашем мобильном приложении для соответствующего клиента / пользователя.

  1. Теперь вы можете использовать стандартный POST API, предлагаемый laravel passport, для запроса токена доступа через предоставление пароля с помощью «oauth / token», используя следующие параметры:

    grant_type : 'password'
    client_id  : '<email with which the user is registered>'
    client_secret : '<generate the client secret from the mobile app>'
    username : '<email with which the user is registered>'
    password : '<password entered by the user>'
    scope : '<leave empty as default>'
    
  2. Вышеприведенный ответ даст вам ответ, если все правильно, примерно так:

    {
    "token_type": "Bearer",
    "expires_in": 3155673600,
    "access_token":         "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjMwZmM0MDk1NWY5YjUwNDViOTUzNDlmZjc2M2ExNDUxOTAxZjc5YTA5YjE4OWM1MjEzOTJlZmNiMDgwOWQzMzQwM2ExZWI4ZmMyODQ1MTE3In0.eyJhdWQiOiJzaHVqYWhtQGdtYWlsLmNvbSIsImp0aSI6IjMwZmM0MDk1NWY5YjUwNDViOTUzNDlmZjc2M2ExNDUxOTAxZjc5YTA5YjE4OWM1MjEzOTJlZmNiMDgwOWQzMzQwM2ExZWI4ZmMyODQ1MTE3IiwiaWF0IjoxNDc4MTQ1NjMyLCJuYmYiOjE0NzgxNDU2MzIsImV4cCI6NDYzMzgxOTIzMiwic3ViIjoiMSIsInNjb3BlcyI6W119.dj3g9b2AdPCK-im5uab-01SP71S7AR96R0FQTKKoaZV7M5ID1pSXDlmZw96o5Bd_Xsy0nUqFsPNRQsLvYaOuHZsP8v9mOVirBXLIBvPcBc6lDRdNXvRidNqeh4JHhJu9a5VzNlJPm3joBYSco4wYzNHs2BPSxXuuD3o63nKRHhuUHB-HwjVxj2GDwzEYXdZmf2ZXOGRJ99DlWGDvWx8xQgMQtd1E9Xk_Rs6Iu8tycjBpKBaC24AKxMI6T8DpelnFmUbMcz-pRsgCWCF_hxv6FpXav3jr1CLhhT58_udBvXjQAXEbtHeB7W_oaMcaqezHdAeOWDcnqREZHsnXHtKt0JpymcTWBkS2cg7sJzy6P9mOGgQ8B4gb8wt44_kHTeWnokk4yPFRZojkHLVZb8YL6hZxLlzgV1jCHUxXoHNe1VKlHArdlV8LAts9pqARZkyBRfwQ8oiTL-2m16FQ_qGg-9vI0Suv7d6_W126afI3LxqDBi8AyqpQzZX1FWmuJLV0QiNM0nzTyokzz7w1ilJP2PxIeUzMRlVaJyA395zq2HjbFEenCkd7bAmTGrgEkyWM6XEq1P7qIC_Ne_pLNAV6DLXUpg9bUWEHhHPXIDYKHS-c3N9fPDt8UVvGI8n0rPMieTN92NsYZ_6OqLNpcm6TrhMNZ9eg5EC0IPySrrv62jE",
    "refresh_token": "BbwRuDnVfm7tRQk7qSYByFbQKK+shYPDinYA9+q5c/ovIE1xETyWitvq6PU8AHnI5FWb06Nl2BVoBwCHCUmFaeRXQQgYY/i5vIDEQ/TJYFLVPRHDc7CKILF0kMakWKDk7wJdl5J6k5mN38th4pAAZOubiRoZ+2npLC7OSZd5Mq8LCBayzqtyy/QA5MY9ywCgb1PErzrGQhzB3mNhKj7U51ZnYT3nS5nCH7iJkCjaKvd/Hwsx2M6pXnpY45xlDVeTOjZxxaOF/e0+VT2FP2+TZMDRfrSMLBEkpbyX0M/VxunriRJPXTUvl3PW0sVOEa3J7+fbce0XWAKz7PNs3+hcdzD2Av2VHYF7/bJwcDCO77ky0G4JlHjqC0HnnGP2UWI5qR+tCSBga7+M1P3ESjcTCV6G6H+7f8SOSv9FECcJ8J5WUrU+EHrZ95bDtPc9scE4P3OEQaYchlC9GHk2ZoGo5oMJI6YACuRfbGQJNBjdjxvLIrAMrB6DNGDMbH6UZodkpZgQjGVuoCWgFEfLqegHbp34CjwL5ZFJGohV+E87KxedXE6aEseywyjmGLGZwAekjsjNwuxqD2QMb05sg9VkiUPMsvn45K9iCLS5clEKOTwkd+JuWw2IU80pA24aXN64RvOJX5VKMN6CPluJVLdjHeFL55SB7nlDjp15WhoMU1A="}
    

Надеюсь, это поможет вам!
Приветствия.

3

Другие решения

Клиент и пользователь — это не одно и то же! В этом случае клиент является Mobile_Application, который имеет несколько пользователей? Таким образом, вам нужен только 1 клиент, чтобы это работало. Попробуйте, если это поможет вашим потребностям?

Установите Auth-Scaffolding по умолчанию в laravel Док здесь
Установить паспорт Док здесь
Зарегистрировать пользователя через auth-scaffolding
Перейти к RESTED или POSTMAN, или любой другой подобный сервис
Проверьте данные в таблице oauth_clients для ваших form_params
С RESTED через Request_body_form_data не заголовки пишут ваши form_params и отправляют запрос POST в * / oauth / token (требуется полный URL)

(обязательные поля form_params: grant_type, client_id, client_secret, имя пользователя и пароль)

Вы должны получить взамен объект с 4 ключами
(token_type, expires_in, access_token & refresh_token) и статус 200 ОК.

Если бы все было успешно до сих пор …

Откройте другое окно RESTED:

Отправьте запрос GET в / api / user (снова требуется полный URL). В заголовках напишите 2 пары имя-значение (Accept => application / json, Authorization => Носитель ACCESS_TOKEN_GOTTEN_IN_PREVIOUS_REQUEST (в / oauth / token)

И это должно быть так. Вы должны получить объект пользователя как ответ от / api / user.

1

По вопросам рекламы [email protected]