Ser*_*giu 7 authentication httprequest microservices lumen
我正在开发我的第一个基于微服务的应用程序。与大多数微服务架构一样,有一个 API 网关可以减少客户端必须发出的请求数量。由于这是应用程序内的单一入口点,我认为这是必须检查授权的地方。所以我做了一个Authentication Microservice来处理登录、注册和身份验证检查。它使用带有 OAuth2 的 Passport。
在 API 网关中,我希望允许某些路由只能由经过身份验证的用户访问,因此一个好的方法是Auth Middleware捕获任何 HTTP 请求。由于身份验证只能在身份验证微服务中处理,我的想法是使用中间件内部的请求“ping”服务,然后检查响应代码。如果是200,API 网关将继续访问微服务。如果是401,API 网关将401自身返回到 UI。
现在有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)
使用这种技术,我还将经过身份验证的用户附加到请求中,因此我可以在控制器中使用用户数据,而无需再次调用身份验证微服务。由于大多数必须进行身份验证保护的路由通常使用用户数据,因此这很方便。
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |