Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel OAuth2密码授予混淆_Laravel_Api_Authentication_Oauth 2.0_Laravel 5.4 - Fatal编程技术网

Laravel OAuth2密码授予混淆

Laravel OAuth2密码授予混淆,laravel,api,authentication,oauth-2.0,laravel-5.4,Laravel,Api,Authentication,Oauth 2.0,Laravel 5.4,我已经读了下面的文章,它真是太棒了。那篇文章的所有内容都很清楚,但我有一个重大疑问 文章作者说,在“OAuth2密码授予”中,当登录到移动应用程序时,只需发送电子邮件和密码即可从API服务器获取访问令牌,但我在许多地方都看到,在该请求中,您还需要发送client_id和client_secret。我将使用Laravel构建我的API: 在这里,您可以看到它迫使我在该请求中发送client_id和client_secret 我真的很困惑。如果我必须在该请求中发送client_id和client

我已经读了下面的文章,它真是太棒了。那篇文章的所有内容都很清楚,但我有一个重大疑问

文章作者说,在“OAuth2密码授予”中,当登录到移动应用程序时,只需发送电子邮件和密码即可从API服务器获取访问令牌,但我在许多地方都看到,在该请求中,您还需要发送client_id和client_secret。我将使用Laravel构建我的API:

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

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

任何帮助都将不胜感激


感谢

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

我想与Facebook登录集成;我在Facebook上创建了一个客户端,并将其整合到我的服务中,通过Facebook的Facebooks了解我的服务是谁

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

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

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

这将直接返回访问令牌和刷新令牌,您可以将其安全地存储在移动应用程序中。

我在名为
配置Passport
的迁移中创建了授权客户端,并设置了我希望应用程序使用的密钥。您不需要每个用户都有一个客户端

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:install

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

您可以在oauth_clients表中找到客户机id,其中password_client为true。可能是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' => '',
    ],
]);

有两个不同的概念:

  • 客户端:用于与服务器通信的软件。通常,你会有3个主要客户端,分别是你的iOS、Android和web应用程序
  • 用户:最终用户将与您的一个客户机交互,然后客户机将代表您与Oauth服务器通信
因此,您将只需要生成一次
客户机id
&
客户机secret
。然后,您可以使用这些密钥作为Oauth服务器和最终用户之间的授权中间人

在密码授予的情况下,
客户端密钥
保密密钥
用于为您拥有的每个客户端的每个用户获取
访问令牌

一旦客户端获得特定用户的
access\u令牌
(通常在登录时),客户端将不再需要发送
client\u密钥
secret\u密钥
,只需发送
access\u令牌


但是,如果该用户的
access\u令牌
已过期,则必须使用这些密钥将新的
access\u令牌
与登录过程中已收到的
refresh\u令牌
交换

谢谢。只是想让你知道,我将同时构建应用程序和API,这样就不会有像facebook这样的第三方网站了。因此,正如您所知,为了获得访问令牌,需要客户端id和客户端机密,那么我是否应该创建它们,然后输入移动应用程序代码,并在API请求中发送它们?在这种情况下,无论设备和用户如何,这些凭据都是相同的。你不能将它们放在移动应用程序上,移动应用程序上的任何代码都是可拦截的,并且可以直接读取。任何人都可以反编译你的应用程序并读取你的客户id和密码。检查一下,它满足了您的一些需求。谢谢,如果您能更详细地解释一下,那就太好了。@ParthVora补充了一点,您有什么特别缺少的吗?所以在应用程序中,我必须硬编码客户端id和客户端机密?您可以这样做,或者将自定义登录路由作为包装器添加到api中,该包装器接受用户/pass作为参数,构建oauth请求,包括客户端id和密码,并将其发布到oauth/token路由。这样以后就更容易改变秘密了。