我正在开发我的第一个基于微服务的应用程序。与大多数微服务架构一样,有一个API网关可以减少客户端必须提出的请求数量。由于这是应用程序内的单一入口点,我认为这是必须检查授权的地方。所以我做了Authentication Microservice
来处理登录,注册和身份验证。它使用带有OAuth2的Passport。
在API网关中,我想允许某些路由仅由经过身份验证的用户访问,因此一个好的方法是Auth Middleware
,它将捕获任何HTTP请求。由于只能在Authentication Microservice中处理身份验证,我的想法是" ping"我的中间件中包含请求的服务,然后检查响应代码。如果是200
,API网关将继续访问微服务。如果它是401
,则API网关会将401
本身返回给用户界面。
现在有两个问题:
这是一种很好的方法吗?
如何将请求从API网关(流明)传递到身份验证微服务(流明),以便检查?
(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);
}
}
使用这种技术,我还将经过身份验证的用户附加到请求中,因此我可以在控制器中使用用户数据,而无需再次调用身份验证微服务。由于大多数必须受到身份验证保护的路由通常都使用用户数据,因此这很方便。