2016-11-01 2 views
0

also meine mobile App wäre der Client, ich habe eine client_id und eine client_secret dafür generiert.Laravel Passport Password Grant Tokens: eigene mobile App

Benutzer, die die mobile App verwenden, müssen sich mit ihrem Benutzernamen/Passwort anmelden.

Wo sollte ich die client_id und client_secret speichern? ist es in Ordnung, sie zu entlarven und sie einfach in der App fest codiert zu platzieren?

Antwort

2

Es ist definitiv nicht die sichere Art, sie hart zu codieren und sie einfach in eine App zu legen.

Eigentlich ist es nicht so einfach. Ich nehme an, Sie haben den Client vom Handwerker oder von den vorgefertigten Vue-Komponenten erstellt. In jedem Fall müssen Sie mehr tun, um die oauth2 api sicher zu konsumieren, ohne potenzielle Sicherheitslücken in Ihrer App zu entdecken.

Angenommen, Ihre mobilen Benutzer würden sich vom Mobiltelefon aus registrieren, müssten Sie einen Benutzer und einen oAuth2-Client über Ihre mobile API erstellen, den Sie für Ihre Kunden (mobile Apps) bereitstellen. Dazu müssen Sie folgendes tun:

  1. Nach der Installation Laravel Pass führen Sie den folgenden Handwerker Befehl

    php artisan migrate 
    

    Dies erzeugt die notwendigen Tabellen speichern oauth Kunden, ihre Token und andere damit zusammenhängende wichtige Informationen auf Db-Ebene. Danach müssten Sie client_if dats in VARCHAR (255) ändern, um den Benutzernamen als client_id zu speichern, anstatt numerische client_ids zu speichern.

2.Now auf Ihre Modelle gehen und ein Modell für oauth_clients Tabelle erstellen, so dass Sie Client pragmatisch aus dem Code erstellen können, während die Benutzer zu schaffen.

<?php 
    namespace App; 


    use Illuminate\Database\Eloquent\Model; 

    class oAuthClient extends Model 
    { 

    protected $table = 'oauth_clients'; 

    } 

Dies wird eine Modellklasse für Sie, durch die Sie erstellen oauth Kunden in der DB speichern können, während sie in der App registrieren.

  1. 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.' 
    ]; 
    }); 
    

Dies wird einen Eintrag in Benutzertabelle und oauth_clients Tabelle erzeugen, die durch Laravel Reisepass verwendet werden entsprechende access_tokens für die user.In den obigen Code zu generieren Schnipsel müssen Sie beachten, dass Sie zum Generieren des oauth_client-Geheimnisses eine starke Verschlüsselungsformel verwenden müssen, die Sie mit Ihrer Anwendung verwenden können. Verwenden Sie die gleiche Technik, um den geheimen Schlüssel in Ihrer mobilen App für den jeweiligen Kunden/Benutzer zu generieren. mit "oauth/Token" mit den folgenden Parametern

  1. Jetzt können Sie den Standard-POST API von Laravel Pass angeboten verwenden Zugriffstoken durch Passwort Zuschuss beantragen:

    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>' 
    

5.Die oben erhalten Sie eine Antwort geben, wenn alles korrekt ist, ähnlich ist:

{ 
     "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=" 
    } 

Sie diese Token verwenden können sicher von Ihrem clien t Apps (mobile Apps). Hoffe es hilft !.

+0

Sie nehmen also an, dass jeder Benutzer ein Client ist. Ich bin sehr neu bei oauth2, aber es ist nicht so, wie ich es mir vorgestellt habe. Ich dachte, dass Kunden keine Benutzer sind, eher wie ein Dienstanbieter wie eine mobile App, ein Server, der sich integrieren möchte usw. , also in meinem Fall sind meine mobile App und mein Webportal Clients. und mein Ansatz war, eine Middleware zu erstellen, die die client_id und client_secret bei Auth-Anfrage injiziert. – sam1188

+0

Ja, bro, wenn Sie access_token pro Person mit der mobilen App bereitstellen möchten, müssen Sie jedem Benutzer relevante access_token zur Verfügung stellen und diese als separaten Client behandeln, damit die access_token der App getrennt verwaltet werden können. Zweitens müssen Sie, da jeder Client aus der mobilen App auf die APIs mit seiner eigenen Zugriffsebene zugreifen muss, möglicherweise unterschiedliche Bereichsebenen für unterschiedliche Benutzer verwenden, auf denen nur bestimmte APIs Zugriff haben. Aus diesen Gründen ist jeder Benutzer ein Client. –

Verwandte Themen