Laravel Passport Password Grant Tokens:自己的移动应用

Posted

技术标签:

【中文标题】Laravel Passport Password Grant Tokens:自己的移动应用【英文标题】:Laravel Passport Password Grant Tokens: own mobile app 【发布时间】:2017-03-15 03:52:09 【问题描述】:

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

使用移动应用程序的用户必须使用他们的用户名/密码登录。

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

【问题讨论】:

【参考方案1】:

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

实际上,它并不是那么直截了当。我假设您从工匠或预构建的 Vue 组件创建客户端。无论哪种情况,您都需要做更多工作才能安全地使用 oauth2 api,而不会暴露应用程序中的任何潜在安全漏洞。

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

    安装 laravel 护照后执行以下 artisan 命令

    php artisan migrate

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

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

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

这将为您创建一个模型类,您可以通过该模型类将 oauth 客户端存储在数据库中,同时在您的应用中注册它们。

    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_clients 表中生成一个条目,laravel 通行证将使用该条目为用户生成相应的 access_tokens。在上面的代码 sn-p 中,您必须注意要生成 oauth_client 密码,您必须使用一些强大的加密公式,您可以在应用程序中使用它。还可以使用相同的技术在您的移动应用上为相应的客户/用户生成密钥。

    现在您可以使用 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>'
    

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

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

【讨论】:

所以您对此的看法是每个用户都是客户。我对 oauth2 很陌生,但这不是我想象的那样。我认为客户不是用户,更像是服务提供商,例如移动应用程序,一些希望集成的服务器等......所以在我的情况下,我的移动应用程序和门户网站是客户端。我的方法是创建一个中间件,根据身份验证请求注入 client_id 和 client_secret。 是的,兄弟,如果您想使用移动应用程序为每个人提供 access_token,您需要为每个用户提供相关的 access_tokens,从而将他们作为单独的客户端处理,以便他们的 access_tokens 通过应用程序可以分开管理。其次,由于来自移动应用程序的每个客户端都需要以自己的访问级别访问 API,因此您可能需要为不同的用户设置不同的范围级别,基于这些级别,只有特定的 API 访问权限会向他们公开。由于这些原因,每个用户都是客户。 @ShujaAhmed 你会在 2 年后添加什么吗?我正在尝试实现完全相同的东西,但无法决定是使用 Passport 还是采取简单的方法并使用简单的 JWT。 我建议使用 JWT 代替护照,因为不幸的是,社区对护照的工作并不多,主要是因为 JWT 正在成为服务器级别授权的通用标准。过去 4 年我们一直在使用 JWT,甚至没有遇到任何问题。通过 JWT 编码和解码有效负载,您可以获得额外的安全选项,以应用来自客户端的所有有效负载在进出服务器时进行解码,并在接收端使用相应的签名进行解码。所以我会推荐 JWT @ShujaAhmed 谢谢你的回复。我正在尝试您在上面发布的方法,并且可以正常工作。我有一个问题,当我在服务器应用程序和移动应用程序上独立生成 client_secret 时,我如何将它存储在我的移动应用程序上?在服务器上它将位于 oauth_clients 表中,但移动应用程序呢?

以上是关于Laravel Passport Password Grant Tokens:自己的移动应用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有自定义用户名列的 Laravel Passport

laravel 的passport Oauth 认证登录请求 的 oauth_token 重置

Laravel 8、Passport 和 MongoDB 集成

无法找到 [Laravel\Passport\Client] 的工厂

每天一点点之laravel框架 - Laravel5.6 + Passport实现Api接口认证

Laravel Passport 无效范围提供了异常