问题理解 Laravel 6.0 Passport with Password Grant Tokens 流程

Posted

技术标签:

【中文标题】问题理解 Laravel 6.0 Passport with Password Grant Tokens 流程【英文标题】:Issue understanding Laravel 6.0 Passport with Password Grant Tokens flow 【发布时间】:2020-07-13 12:39:21 【问题描述】:

我在理解验证客户端以使用基于 Laravel 构建的 API 的整个过程时遇到问题。有些事情现在不适合我。

我正在尝试在 Laravel 上实现 API 和 OAuth 服务器。 API 将由受信任的本机移动应用程序使用。对我来说更有意义的流程是 Laravel 的 Passport 文档中描述的“密码大令牌”:https://laravel.com/docs/7.x/passport#password-grant-tokens

据我了解实现:

    用户安装我的移动应用。 安装后,系统会提示他“输入用户名/密码”以继续使用该应用 点击提交后,我在“/oauth/token”上使用“grant_type”、“client_id”、“username”、“password”、“scope”向我的 Laravel oAuth 服务器实现发出 POST 请求。我省略了“client_secret”,因为我知道将秘密存储在客户端设备上并不是一个好主意。 服务器然后检查已经创建的(`php artisan passport:client --password`)“client_id”、“username”、“password”和“response_type” 如果所有匹配,它会生成一个令牌,并以“acces_token”和“refresh_token”响应 我现在可以调用我的 API 端点“/api/whatever/method_name”

我的问题在第 4 点。如果用户已经存在于我的数据库中,我只能发出访问令牌,但我假设这是用户第一次使用我的应用程序。 postman_response

我是否还需要一个“身份验证”步骤,用户发送用户名/密码并且 OAuth 服务器提示“授权应用程序”使用您的数据,此时将用户保存在数据库中,然后继续?

【问题讨论】:

如果你想在你的应用程序中注册一个用户,只需将注册表单指向你的 laravel api 的公共路由,你的整个应用程序不必使用护照中间件。跨度> 【参考方案1】:

通常您有一个注册途径,即未经授权,否则您无法进入应用程序。想象一下您的路线文件。

Route::middleware('auth:api')->group(function () 
       Route::post('/todos', 'TodoController@index');
);

// Without auth
Route::post('/register', 'RegisterController@register');

为了隐藏凭据,使用代理方法通常更容易,因此您的后端可以保存 client_id 和 client_secret,因为它们始终相同(除非您正在构建 oauth 服务器)。

Route::post('/login', 'LoginController@login');

会收到用户名和密码,内部调用oauth/token,并在过程中添加client_idclient_secret并返回token。要通过注册节省一些调用,您可以在注册后执行相同的方法,获取 oauth 令牌,使用您在注册时拥有的凭据并立即返回令牌。

【讨论】:

【参考方案2】:

我会推荐以下内容:

    在登录方法中,检查用户是否存在。 如果存在,请让他登录。 否则,先注册他,然后再登录 最后,返回访问令牌

【讨论】:

以上是关于问题理解 Laravel 6.0 Passport with Password Grant Tokens 流程的主要内容,如果未能解决你的问题,请参考以下文章

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

Laravel Passport 无效范围提供了异常

Laravel 5.3 中未显示 Passport 组件

Laravel 5.3 + Passport:总是未经身份验证的错误

Laravel 7 Passport:被 CORS 策略阻止

如何卸载 Laravel Passport