2016-09-16 42 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我已經爲這個問題定製了答案。由於它不完全重複,但部分解釋了另一個問題的解決方案。 –