Laravel 5.5 - Laravel Passport 使用正确的授权类型?

Posted

技术标签:

【中文标题】Laravel 5.5 - Laravel Passport 使用正确的授权类型?【英文标题】:Laravel 5.5 - Laravel Passport Correct Grant Type To Use? 【发布时间】:2018-08-27 19:23:42 【问题描述】:

我有一个应用程序,用户可以通过该网站正常注册并发布职位空缺。

我希望注册用户能够通过第三方多职位发布应用程序使用我的 api 发布职位空缺,即用户在第三方网站上注册,他们会看到一个表单,该表单发布到我网站上的 api 端点。

现在我的问题是如何使用 Laravel Passport 来实现它。

以下是否正确:

    我为第三方应用程序创建了一个护照客户端?

    向第三方应用程序提供其客户端 ID 和客户端密码。

    当用户在第三方网站上提交表单时,他们将包括其用户名(电子邮件)和密码以及其他表单数据。

    第三方应用程序使用密码授予方法向 (http://my-app.com/oauth/token) 发出请求,以使用其客户端 ID、客户端密码、用户电子邮件和密码请求访问令牌。

    如果返回有效的访问令牌,则使用该令牌和表单数据向 (http://my-app.com/api/jobs/add) 端点发出第二个请求。

有人可以建议这是使用正确的授权类型还是注册用户提供第三方应用程序登录凭据以获取访问令牌是否不安全?

用于上述用例的正确授权类型是什么?

如果我要使用 authorization_grant 方法,谁将负责创建客户端 - my-app.com 的管理员或 my-app.com 的注册用户?

如果它是 my-app.com 的注册用户,那么这是否意味着每个注册用户都必须在 my-app.com 上为同一个第三方应用程序创建一个客户端,这与第三方应用程序一样没有意义最终有多个客户端 ID,那么他们将如何实现回调 url?

这很令人困惑。

【问题讨论】:

【参考方案1】:

除了第 3 点之外,您或多或少都在轨道上。

向第三方系统授予对用户凭据的访问权限并不是一个好主意,甚至可能在法律上也不可接受。 而是提供一个 url,它可以在弹出窗口中打开以进行身份​​验证,并将身份验证令牌返回给 window.opener

您可以为父窗口(window.opener)提供一个函数,该函数接受在登录成功/错误时调用的回调:

var popup = window.open("/someUrl");
popup.onload = function()
   popup.onLogin(onLoginSuccessCallback, onLoginErrorCallback);
;

或者父窗口可以有一个你可以在弹出窗口中调用的函数:

window.opener.loginCallback(token);

【讨论】:

所以基本上你是说用户应该使用我自己的应用程序中的表单进行身份验证,该表单将返回访问令牌。我以前从未遇到过这样的身份验证api?这种方法对最终用户来说似乎不是无缝的。 是的,这并不理想,但这就是使用 Facebook、Google 帐户等登录的方式。我想大多数用户都会习惯这种身份验证。 这和使用authorization_grant方法不一样吗:laravel.com/docs/5.3/passport#requesting-tokens 我可能误解了您的情况,但从您的描述看来,您希望允许在您的系统中注册的用户通过 3rd 方 api 客户端进行身份验证。如果这是正确的,您建议的方法会将他们的凭据暴露给第 3 方,这在大多数情况下是不可接受的。如果一个实体同时拥有 API 和客户端,那将不是问题。 是的,这是正确的。我希望能够通过使用我的 api 的第三方系统对在我的系统中注册的用户进行身份验证。例如。用户已在我的系统上注册。然后他们在使用我的 api 的第三方系统上注册。从第三方系统我需要能够验证发布到我的系统的用户。我只能想到密码授予方法来使其可行,但正如您所说,这会将用户密码暴露给第三方。我不太了解授权授予方法,我怀疑这是否适合我的用例。还有其他想法吗?

以上是关于Laravel 5.5 - Laravel Passport 使用正确的授权类型?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 教程 - Web 开发实战入门 ( Laravel 5.5 )购买链接

无法使用 laravel 5.5 建立 laravel 关系

Uncaught ReferenceError: $ is not defined - Laravel 5.5 + Laravel Mix

DB::statement();在 Laravel (5.5)

Laravel 5.5。队列推送

laravel从5.2到5.5从入门到精通视频教程共16套