Я занимаюсь разработкой микросервиса в Люмене. Микросервис будет использовать Auth Microservice для генерации API Key
или ClientID/Secret(JWT TOKEN)
.
Всякий раз, когда клиент с действительным Token
или API Key
отправляет вызов API, я хочу проверить его с помощью Auth Microservice.
Для проверки я создал
/api/oauth/verify - with encrypted TOKEN in header in Auth Microservice
Эта конечная точка вернет id
пользователя при проверке.
Вот код, который я сделал на промежуточном программном обеспечении Микросервиса, чтобы отправить TOKEN для проверки
$newEncrypter = new \Illuminate\Encryption\Encrypter( config('app.key'), Config::get( 'app.cipher' ) );
$encryptedBearerToken = $newEncrypter->encrypt( $request->bearerToken() );
//dd($bearerToken);
$client = new Client(
[
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $request->bearerToken()
],
'verify' => false
]);
$response = $client->post($url, ['json' => ['token' => $encryptedBearerToken]])->getBody()->getContents();
$response = json_decode($response);
$request->user = $response;
Код на промежуточном программном обеспечении Auth Microservice
$bearerToken = $request->bearerToken();
$encryptedToken = $request->token;
if(!empty($encryptedToken))
{
$newEncrypter = new \Illuminate\Encryption\Encrypter( config('app.message_key'), Config::get( 'app.cipher' ) );
$decryptedBearerToken = $newEncrypter->decrypt( $encryptedToken );
if($bearerToken !== $decryptedBearerToken)
{
return $this->invalidToken();
}
}
$validateApi = $this->authenticate(['api']);
if(!$validateApi)
{
if(empty($bearerToken))
{
return $this->invalidToken();
}
$user = User::where('api_key', $bearerToken)->first();
if(empty($user))
{
return $this->invalidToken();
}
\Illuminate\Support\Facades\Auth::setUser($user);
}
Некоторые вопросы относительно реализации кода выше
- Действителен ли подход для отправки зашифрованного токена на внешний API?
- Это лучший способ аутентифицировать токен или ключ API?
Проблемы:
- Запрос Curl на промежуточное ПО для Auth Microservice довольно трудоемкий и при нагрузочном тестировании вызывает
502 Gateway timeout
Как я могу лучше аутентифицировать TOKEN и оптимизировать аутентификацию
[ПРИМЕЧАНИЕ: реализация работает нормально при выполнении одного запроса
через POSTMAN]