Lumen Auth 微服务

Ser*_*giu 7 authentication httprequest microservices lumen

我正在开发我的第一个基于微服务的应用程序。与大多数微服务架构一样,有一个 API 网关可以减少客户端必须发出的请求数量。由于这是应用程序内的单一入口点,我认为这是必须检查授权的地方。所以我做了一个Authentication Microservice来处理登录、注册和身份验证检查。它使用带有 OAuth2 的 Passport。

在 API 网关中,我希望允许某些路由只能由经过身份验证的用户访问,因此一个好的方法是Auth Middleware捕获任何 HTTP 请求。由于身份验证只能在身份验证微服务中处理,我的想法是使用中间件内部的请求“ping”服务,然后检查响应代码。如果是200,API 网关将继续访问微服务。如果是401,API 网关将401自身返回到 UI。

这是我的想法的图形表示: 在此处输入图片说明

现在有2个问题:

  1. 这是该架构的好方法吗?

  2. 如何将请求从 API 网关 (Lumen) 传递到身份验证微服务 (Lumen) 以便进行检查?

(LE:我不必传递整个请求,我只需要传递Authorize标头,请查看下面的解决方案)

稍后编辑:

我已经设法在中间件中使用它解决了这个问题:

<?php

namespace App\Http\Middleware;

use Closure;
use GuzzleHttp\Client;

class Authenticate
{
    public function handle($request, Closure $next)
    {
        if($request->header('Authorization')) {
            $url = env('AUTHORIZATION_URL') . '/auth/check';
            $client = new Client();
            $headers = ['Authorization' => $request->header('Authorization')];
            $client = $client->request('GET', $url, ['headers' => $headers]);
            $status = $client->getStatusCode();
            if($status === 200) {
                $authenticated_user = json_decode($client->getBody());
                $request->request->add(['authenticated_user' => $authenticated_user]);
                return $next($request);
            }
        }

        return response('Unauthorized.', 401);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这种技术,我还将经过身份验证的用户附加到请求中,因此我可以在控制器中使用用户数据,而无需再次调用身份验证微服务。由于大多数必须进行身份验证保护的路由通常使用用户数据,因此这很方便。