Lumen Auth微服务

时间:2017-10-30 13:01:10

标签: authentication httprequest microservices lumen

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

在API网关中,我想允许某些路由仅由经过身份验证的用户访问,因此一个好的方法是Auth Middleware,它将捕获任何HTTP请求。由于只能在Authentication Microservice中处理身份验证,我的想法是" ping"我的中间件中包含请求的服务,然后检查响应代码。如果是200,API网关将继续访问微服务。如果它是401,则API网关会将401本身返回给用户界面。

以下是我的想法的图形表示: enter image description here

现在有两个问题:

  1. 这是一种很好的方法吗?

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

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

    LATER EDIT:

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

    <?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);
        }
    }
    

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

0 个答案:

没有答案