2

モバイル アプリケーションを提供する API を作成しようとしています。PassportでLaravel 5.3を使用しています。

流れ自体はこんな感じです。モバイル アプリは 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

これはまったく変更していません。これがデフォルトのスキーマです。

これは私のニーズには意味がありません。たくさんのクライアントは必要ありません。必要なクライアントは 1 つだけです。モバイルアプリ自体。

もちろん、モバイル アプリ自体のためだけにユーザーを作成することもできます。Facebook ユーザーには常にテーブル内のモバイル アプリが割り当てられuser_idますoauth_clientsが、それは間違っているようです。

4

2 に答える 2

5

Laravel 5.3 パスポートの問題点は、lucadegasperi が提供する以前の OAuth 2.0 Server for Laravel ライブラリとは異なり、クライアントを直接作成するための API がないことです。そのため、クライアントはフロントエンドを介してのみ作成できるようになりました。参考までに、laravel パスポートをモバイルアプリ専用に使用したかったので、ユーザーを作成して登録する際に、EMAIL とパスワードのみ、場合によっては Facebook UserID のみを使用します。

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

上記のコード スニペットでは、oauth_client シークレットを生成するには、アプリケーションで快適に使用できる強力な暗号化方式を使用する必要があることに注意してください。また、同じ手法を使用して、それぞれのクライアント/ユーザーのモバイル アプリで秘密鍵を生成します。

  1. これで、laravel パスポートが提供する標準の POST API を使用して、次のパラメーターを使用して「oauth/token」を使用してパスワード付与を通じてアクセス トークンを要求できます。

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

それがあなたを助けることを願っています! 乾杯。

于 2016-11-03T20:44:26.607 に答える
1

クライアントとユーザーは同じではありません! この場合、クライアントは複数のユーザーを持つ Mobile_Application ですか? したがって、これが機能するために必要なクライアントは 1 つだけです。あなたのニーズに役立つ場合は、これを試してみてください。

デフォルトの Auth-Scaffolding を laravel doc に
インストールしますここ
に Passport doc をインストールし ます auth-scaffolding を介してユーザーを登録します
Goto RESTED または POSTMAN、またはその他の同様のサービス oauth_clients
テーブルで form_params のデータを確認します
*/oauth/token に POST リクエストを送信します (完全な URL が必要です)

(必要な form_params は、grant_type、client_id、client_secret、ユーザー名、およびパスワードです)


4 つのキー(token_type、expires_in、access_token、refresh_token) と 200 OK のステータスを持つオブジェクトを返す必要があります。

これまでのすべてが成功した場合...

別の RESTED ウィンドウを開きます。

/api/user に GET リクエストを送信します (ここでも完全な URL が必要です)

そして、それはそれであるべきです。/api/user からの応答としてユーザー オブジェクトを取得する必要があります。

于 2016-10-03T13:19:46.670 に答える