Laravel 5.3和护照。尝试为API创建单个客户端

时间:2016-09-16 12:57:27

标签: php laravel-5.3 laravel-passport

我正在尝试创建一个服务于移动应用程序的API。我使用Laravel 5.3和Passport。

流程本身就是这样。移动应用程序将为API提供一个facebook访问令牌,该令牌将用于获取有关用户的一些信息(Facebook ID,姓名,个人资料图片和电子邮件)。此时,后端将插入(如果它尚未存在)上述信息到用户表中,基本上创建新用户。请注意,无论如何,后端都无法登录到facebook,因为移动应用已授予访问令牌。

之后需要发生的事情是后端将为移动应用提供访问令牌,用于从API本身访问其他路由。这应该通过Passport完成。据我所知,通过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

我没有以任何方式修改它,它是默认架构。

这对我的需求毫无意义,我不想要一堆客户,我只想要一个客户。移动应用程序本身。

我当然可以为移动应用本身创建一个用户,并且将始终在user_id表中为Facebook用户分配移动应用oauth_clients,但这似乎不对。

2 个答案:

答案 0 :(得分:3)

Laravel 5.3护照的问题在于,与之前由lucadegasperi提供的Laravel库的OAuth 2.0 Server不同,它没有直接创建客户端的API。因此,现在客户端只能通过前端进行。仅供参考我们希望仅将laravel护照用于我们的移动应用程序,因此在创建和注册用户时,我们只能使用EMAIL&密码,在某些情况下只有Facebook UserID。

    oauth_clients中的
  1. 将id字段转换为普通字段,即将其作为主键删除,并将数据类型设置为varchar,以便我们可以将电子邮件地址存储为client_ids,因为它们对于您的系统也是唯一的。在Facebook登录的情况下,我们将Facebook用户ID存储在此列中,这对于我们的每个客户来说也是唯一的。也适用于其他表格:oauth_access_tokens,oauth_auth_codes& oauth_personal_access_clients将client_id更改为VARCHAR(255),以便它可以存储电子邮件地址或Facebook用户ID。

  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.'
    ];
    });
    
  4. 在上面的代码片段中,您必须注意,要生成oauth_client密钥,您必须使用一些强大的加密公式,您觉得将其与您的应用程序一起使用是很舒服的。还可以使用相同的技术在您的移动应用程序上为相应的客户端/用户生成密钥。

    1. 现在,您可以使用laravel passport提供的标准POST API通过密码授权使用&#34; oauth / token&#34;来请求访问令牌。使用以下参数:

      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. 希望它对你有所帮助! 欢呼声。

答案 1 :(得分:1)

客户和用户不一样!在这种情况下,客户端是Mobile_Application,它有多个用户?所以你只需要一个客户端就可以了。如果它有助于您的需求,请尝试这个吗?

在laravel doc's here中安装默认的Auth-Scaffolding 安装护照doc's here
通过auth-scaffolding注册用户
转到RESTED或POSTMAN,或任何其他类似的服务
检查oauth_clients表中的数据以获取form_params
使用RESTED通过Request_body_form_data而不是标题写入你的forms_params并向* / oauth / token发送POST请求(需要完整网址)

(必需的form_params是grant_type,client_id,client_secret,用户名和密码)

你应该得到一个有4个键的对象
(token_type,expires_in,access_token&amp; refresh_token)和状态200 OK。

如果到目前为止一切都成功了......

打开另一个RESTED窗口:

向/ api / user发送GET请求(需要再次填写完整网址)在标头中写入2个名称 - 值对(Accept =&gt; application / json,Authorization =&gt; Bearer ACCESS_TOKEN_GOTTEN_IN_PREVIOUS_REQUEST(to / oauth / token)

那应该是它。您应该从/ api / user获取用户对象作为响应。