OAuth2密码授予混淆

时间:2017-05-10 07:25:37

标签: laravel api authentication oauth-2.0 laravel-5.4

我已阅读下面的文章,它真棒。该文章的所有内容都很清楚,但我有一个主要的疑问。

https://stormpath.com/blog/the-ultimate-guide-to-mobile-api-security

文章作者说,在登录移动应用程序时'OAuth2密码授权',只需要发送电子邮件和密码以便从API服务器获取访问令牌,但我在很多地方都读过你也知道了需要在该请求中发送client_id和client_secret。我将使用Laravel构建我的API:

https://laravel.com/docs/master/passport#password-grant-tokens

在这里,您可以看到它强制我在该请求中发送client_id和client_secret。

我真的很困惑。如果我必须在该请求中发送client_id和client_secret,首先我需要通过在其上创建客户端从授权服务器获取它。那么在哪个事件中,我应该创建该客户端?当用户尝试从移动应用程序登录时?我只需要知道确切的流程。

任何帮助都将不胜感激。

由于

3 个答案:

答案 0 :(得分:1)

为需要与OAuth2服务器集成的开发人员创建客户端。它与特定用户无关。登录流程。

离。我想与Facebook登录整合;我在Facebook上创建了一个客户端并将其整合到我的服务中,这是Facebook知道我的服务对象的方式。

因此,用户通过您的应用程序登录;然后,您的应用程序将该用户名和密码发送到后端服务器。然后,后端服务器添加client_id和secret,以便OAuth服务器可以验证请求的真实性。

因此,在您的情况下,用户登录到您的移动应用程序,您将该登录请求(用户名和密码,使用SSL)发送到后端服务器。然后,您的后端服务器会将该请求转发给OAuth2服务,就像下面的请求一样。

'form_params' => [
    'grant_type' => 'password',
    'client_id' => 'client-id',
    'client_secret' => 'client-secret',
    'username' => 'user@email.com',
    'password' => 'user-password',
    'scope' => '',
],

这会直接返回一个access_token和一个可以安全存储在移动应用程序中的刷新令牌。

答案 1 :(得分:0)

我在名为ConfigurePassport的迁移中创建了授权客户端,并设置了我希望应用使用的密钥。每个用户不需要客户端。

public function up()
{
    /*
     * This command will create the encryption keys needed to generate secure access tokens.
     * In addition, the command will create "personal access" and "password grant"
     * clients which will be used to generate access tokens
     */
    Artisan::call( 'passport:install', array('-n' => true) );

    // Set Password Grant Client secret to known key
    DB::table( 'oauth_clients' )->where( 'password_client', 1 )->update(
        ['secret' => env( 'GRANT_CLIENT_SECRET', 'dfhsdfhbtg545fdf45yedh5f5blahblah' )]
    );
}

上述迁移按照安装客户端的文档运行artisan命令passport:installhttps://laravel.com/docs/master/passport#password-grant-tokens

现在,您的移动应用可以像这样请求令牌:每个用户的唯一参数是用户名和密码。

您可以在oauth_clients表中找到password_client为true的客户端ID。可能是2。

$http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 2,
        'client_secret' => 'dfhsdfhbtg545fdf45yedh5f5blahblah',
        'username' => 'taylor@laravel.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

答案 2 :(得分:0)

有两个不同的概念:

  • 客户端:是用于与服务器通信的软件。通常,您将有3个主要客户端,分别是您的iOS,Android和网络应用。
  • 用户:这是将与您的一个客户端进行交互的最终用户,然后该客户端将代表Oauth服务器进行通信。

因此,您仅需要生成一次client_idclient_secrete。然后,您可以使用这些密钥作为Oauth服务器与最终用户之间的授权中间人。

在使用密码授予的情况下,client_keysecrete_key用于为您拥有的每个客户端的每个用户获取access_token

一旦客户端获得特定用户的access_token(通常是在登录时),客户端就不再需要发送client_keysecrete_key,只需发送{{ 1}}。

但是,如果该用户的access_token已过期,则必须使用这些密钥与您从登录过程中收到的access_token交换新的access_token