2016-09-16 38 views
1

我正在尝试创建一个用于处理移动应用程序的API。我正在使用护照Laravel 5.3。Laravel 5.3和护照。尝试为API创建单个客户端

流本身就是这样。移动应用程序将提供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 

我没有以任何方式修改本,它的默认模式。

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

我当然可以创建一个用户只是为了移动应用程序本身,facebook用户将始终分配oauth_clients表中的移动应用程序user_id,但这只是看起来不对。

回答

0

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

在laravel doc's here
安装默认的认证,脚手架安装护照doc's here
通过AUTH-脚手架
转到注册用户休息或邮递员,或任何其他类似的服务在oauth_clients表
检查数据为您form_params
有了休息过Request_body_form_data不是头写你forms_params和发送POST请求* /的OAuth /令牌(全需要URL)

(需要form_params是grant_type ,CLIENT_ID,client_secret,用户名和密码)

你应该得到与4个按键
(token_type,expires_in返回一个对象,&的access_token refresh_token)和200 OK状态。

如果一切是succesfull那么远,

打开另一个窗口休息:

发送GET请求/ API /用户(再次需要完整的网址)在标题写2名 - 值对(接受=>应用程序/ JSON,授权=>承载ACCESS_TOKEN_GOTTEN_IN_PREVIOUS_REQUEST(到/的OAuth /令牌)

这应该是它。你应该得到一个用户对象从/ API /用户响应。

2

的问题Laravel 5.3护照就是这样先前的OAuth 2。0由Lucadegasperi提供的Laravel库服务器,它没有API直接制作客户端。所以现在客户端只能通过前端完成。仅供参考,我们希望仅将laravel护照用于我们的移动应用程序,因此在创建和注册用户时,我们只能使用EMAIL &密码,某些情况下只能使用Facebook用户ID。

  1. 在oauth_clients

    转换ID字段为普通区,即它删除作为主键,使数据类型为varchar,以便我们能够电子邮件地址存储为client_ids因为他们也是为您的系统是独一无二的。 Incase的Facebook登录我们在这里存储Facebook用户ID在这个列中,这对每个客户来说都是独一无二的。对于其他表,如: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秘密使用一些强大的加密公式,您可以在应用程序中使用它。还可以使用相同的技术为您的移动应用程序为相应的客户端/用户生成密钥。

  • 现在可以使用通过laravel护照提供的标准POST API使用 “的OAuth /令牌” 使用以下paramters通过密码授权,以请求访问令牌:

    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>' 
    
  • 上述会给你一个回应,如果一切是正确的,类似于:

    { 
        "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=" 
    } 
    
  • 希望它可以帮助你! 干杯。

    +0

    @PetterFriberg我已经为这个问题定制了答案。由于它不完全重复,但部分解释了另一个问题的解决方案。 –