2016-11-01 21 views
0

私のモバイルアプリがクライアントになるので、私はそれに対してclient_idとclient_secretを生成しました。Laravel Passportパスワードグラントトークン:自分のモバイルアプリ

モバイルアプリを使用するユーザーは、ユーザー名/パスワードを使用してログインする必要があります。

ここで、client_idとclient_secretを保存する必要がありますか?それらを公開してアプリにハードコードされていてもかまいませんか?

答えて

2

絶対にそれらをハードコーディングしてアプリに配置する安全な方法ではありません。

実際にはそう簡単ではありません。私はあなたが職人から、またはあらかじめ構築されたVueコンポーネントからクライアントを作成したと仮定します。どちらの場合でも、アプリケーションの潜在的なセキュリティ上の脆弱性を露呈することなくoauth2 apiを安全に消費するためには、さらに多くのことが必要です。

モバイルユーザーがモバイルから登録すると仮定すると、クライアント(モバイルアプリ)が消費するために公開するモバイルAPIからuserおよびoAuth2クライアントを作成する必要があります。このためには、次の操作を行う必要があります:

  1. laravelのパスポートには、以下の職人コマンド

    php artisan migrate 
    
    を実行インストールした後

    これはOAuthのクライアント、そのトークンおよびその他の関連する重要な情報を格納するために必要なテーブルを作成します。 dbレベルでその後、数値client_idsを格納するのではなく、client_idとしてusernameを格納するように、client_if datatypeをVARCHAR(255)に変更する必要があります。

  2. 2.次に、oauth_clientsテーブルのモデルを作成して、ユーザー作成時にコードからクライアントを実際に作成できるようにします。

    <?php 
        namespace App; 
    
    
        use Illuminate\Database\Eloquent\Model; 
    
        class oAuthClient extends Model 
        { 
    
        protected $table = 'oauth_clients'; 
    
        } 
    

    oauthクライアントをデータベースに保存して、アプリケーションに登録する際に使用できるモデルクラスが作成されます。

    これはuser.In上記コードの各access_tokensを生成するlaravelパスポートによって使用されるユーザ・テーブルとoauth_clientsテーブルにエントリを生成する
  3. 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シークレットを生成するには、アプリケーションで快適に使用できる強力な暗号化方式を使用する必要があることに注意してください。同じテクニックを使用して、それぞれのクライアント/ユーザのモバイルアプリで秘密鍵を生成します。

<オール開始=「4」>
  • 今、あなたは、次のパラメータ「のOAuth /トークン」を使用して使用して、パスワードの付与を通じてアクセストークンを要求するためにlaravelパスポートが提供する標準POSTのAPIを使用することができます。

    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。すべてが正しい場合は、に似て、あなたの応答が得られます:

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

    あなたのCLIENから安全にこれらのトークンを使用することができますtアプリ(モバイルアプリ) 希望する!

    +0

    これは、すべてのユーザーがクライアントであるということです。私はoauth2には非常に新しいですが、それは私がそれを想像した方法ではありません。私はクライアントがユーザーではなく、モバイルアプリなどのサービスプロバイダのようなものだと思っています。 私の場合、私のモバイルアプリケーションとWebポータルはクライアントです。私のアプローチは、認証要求時にclient_idとclient_secretを注入するミドルウェアを作成することでした。 – sam1188

    +0

    はい、モバイルアプリを使用して個人ごとにaccess_tokenを提供する場合は、各ユーザーに関連するaccess_tokensを提供し、別個のクライアントとして扱う必要があるため、アプリからのaccess_tokensを個別に管理できる必要があります。第2に、モバイルアプリケーションの各クライアントは独自のアクセスレベルでAPIにアクセスする必要があるため、さまざまなユーザーに異なるスコープレベルを設定する必要があります。そのため、特定のAPIアクセスのみが公開されます。これらの理由から、各ユーザーはクライアントです。 –

    関連する問題