Laravel Passport密码授予令牌:自己的移动应用程序

时间:2016-11-01 22:38:20

标签: laravel api authentication laravel-5.3 laravel-passport

所以我的移动应用程序将是客户端,我为它生成了client_id和client_secret。

使用移动应用的用户必须使用其用户名/密码登录。

我应该在哪里存储client_id和client_secret?是否可以公开它们并简单地将它们硬编码到应用程序中?

1 个答案:

答案 0 :(得分:4)

绝对不是硬编码的安全方式,只是将它们放在应用程序中。

实际上并非如此直截了当。我假设您是从artisan或预先构建的Vue组件创建客户端的。在任何一种情况下,您都必须执行更多操作,以便安全地使用oauth2 api,而不会在您的应用中暴露任何潜在的安全漏洞。

假设您的移动用户将从移动设备注册,您需要从您的移动API创建用户和oAuth2客户端,您将为您的客户(移动应用)公开这些客户端。为此,您必须执行以下操作:

  1. 安装laravel护照后,执行以下工匠命令

    php artisan migrate

  2. 这将创建必要的表,以便在db级别存储oauth客户端,其令牌和其他相关重要信息。在此之后,您需要将client_id数据类型更改为VARCHAR(255),以便将用户名存储为client_id,而不是存储数字client_ids。

    1. 现在转到您的模型并为oauth_clients表创建一个模型,以便您可以在创建用户时从代码中实际创建客户端。

      <?php
      namespace App;
      
      
      use Illuminate\Database\Eloquent\Model;
      
      class oAuthClient extends Model
      {
      
      protected $table = 'oauth_clients';
      
      }
      
    2. 这将为您创建一个模型类,您可以通过该模型类在数据库中存储oauth客户端,同时在您的应用程序中注册它们。

      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.'
        ];
        });
        
      2. 这将在用户表和oauth_clients表中生成一个条目,laravel passport将使用该表为用户生成相应的access_tokens。在上面的代码片段中,您必须注意,要生成oauth_client秘密,您必须使用一些强大的加密的公式,您觉得在应用程序中使用它很舒服。还可以使用相同的技术在您的移动应用程序上为相应的客户端/用户生成密钥。

        1. 现在,您可以使用laravel passport提供的标准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. 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="
              }
          

          您可以从客户端应用程序(移动应用程序)安全地使用这些令牌。 希望它有所帮助!