如何将 Laravel 护照用于 Auth 和 Lumen 作为 api

Posted

技术标签:

【中文标题】如何将 Laravel 护照用于 Auth 和 Lumen 作为 api【英文标题】:How to use Laravel passport for Auth and Lumen as api 【发布时间】:2017-10-07 17:37:13 【问题描述】:

我正在研究使用 laravel、laravel passport、lumen 和 AngularJS 开发一个使用 API 的应用程序

我有 3 个域如下

auth.dev - Laravel 5.4 + Passport oAuth 服务器(作为认证服务器) api.dev - Lumen(作为 API seaver) app.dev - php + angularjs(单页应用)

我无法正确配置这 3 个。我已经设置了 auth.dev,它将成功生成令牌,我可以从 app.dev 使用它们。

但我的要求是为 API、Auth 和 APP 使用 3 个单独的实例

我尝试通过 Lumen 配置它(使用 auth.dev 验证访问令牌)但它不起作用。

这可能吗?或者有什么建议可以实现吗?

【问题讨论】:

我们需要有关“不工作”的信息。您看到了什么错误/问题,您采取了哪些步骤来复制它? 好吧,当我使用正确的授权信息和结构调用位于 API (Lumen) 的 auth:api 保护路由时,它将返回未经授权的错误。我想从身份验证服务器验证那些路由(位于 API )。 【参考方案1】:

我最近一直在研究与此相同的实现。花了点功夫才让它高效工作,但它确实奏效了!

基本上,如果您关心验证您收到的令牌(您应该这样做),您将需要一种方法将 Lumen 从客户端应用程序接收到的令牌转发到您的 OAuth 服务,并将该身份验证的一些详细信息返回给您的流明应用。

如果您知道您的 Lumen API 服务将始终在同一台机器上运行,您可以使用某种 RPC 来避免不必要地通过 HTTP - 我通过 OAuth 服务中的自定义 Artisan 命令使用命令行界面以及一个从 Lumen 端运行它的自定义脚本,我称之为 RemoteArtisan。

另一种方法是通过 HTTP,基本上让您的 OAuth 服务提供自己非常基本的 API 端点。在routes/api.php 中应该这样做:

Route::middleware('client')->get('user', function (Request $request) 
    $helper = new App\FirstPartyClientHelper;

    return response()->json($helper->getTokenOwnerDetails($request->bearerToken()));

);

我的FirstPartyClientHelper 是一个简单的类,它解析令牌以从中获取 ID,并使用它从 OAuth 数据库中获取我想要发送回 Lumen 的资源。您可能不需要在这里进行大量查询或发送大量数据,这可能只是简单的通过/失败。取决于你的需要。

我建议弄清楚并将其发送回您的 Lumen 应用程序的一件事是分配给令牌的范围。您可能希望将这些与 Passport 中可用的各种范围中间件一起使用。

目前唯一的选择是将这些中间件类(CheckScopesCheckForAnyScope)复制到您的 Lumen 应用程序中并手动加载它们。但这很简单,因为它们是基本的。

您可能需要修改它们,以便它们可以看到通过您的 Authenticatable 类(通常是 User 模型)从您的 OAuth 端点返回的范围。

这些解决方案中的任何一个都会为每个请求增加一些开销,因此值得考虑在 Lumen 端缓存一段时间的结果。

如果你这样做了,请确保它没有被缓存很长时间,因为它可能允许过期的令牌仍然被认为是有效的。

或者,将令牌的到期时间存储在缓存中的某个位置,并根据请求时间验证该时间,以确保令牌没有过期。

希望这会有所帮助。

【讨论】:

以上是关于如何将 Laravel 护照用于 Auth 和 Lumen 作为 api的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中使用社交名流和护照创建 REST API

使用 nuxt auth 和 laravel 护照登录时出现错误 404

Laravel 护照 VS JWT

Laravel 通过生成的令牌进行身份验证,无需护照和 jwt

如何在用户登录laravel上保存PassportToken

Laravel 护照公共 api 路线