我已阅读下面的文章,它真棒。该文章的所有内容都很清楚,但我有一个主要的疑问。
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,首先我需要通过在其上创建客户端从授权服务器获取它。那么在哪个事件中,我应该创建该客户端?当用户尝试从移动应用程序登录时?我只需要知道确切的流程。
任何帮助都将不胜感激。
由于
答案 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:install
。 https://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)
有两个不同的概念:
因此,您仅需要生成一次client_id
和client_secrete
。然后,您可以使用这些密钥作为Oauth服务器与最终用户之间的授权中间人。
在使用密码授予的情况下,client_key
和secrete_key
用于为您拥有的每个客户端的每个用户获取access_token
。
一旦客户端获得特定用户的access_token
(通常是在登录时),客户端就不再需要发送client_key
和secrete_key
,只需发送{{ 1}}。
但是,如果该用户的access_token
已过期,则必须使用这些密钥与您从登录过程中收到的access_token
交换新的access_token
。