Как аутентифицировать токен с помощью внешнего Auth API в Lumen - PullRequest
0 голосов
/ 11 июля 2019

Я занимаюсь разработкой микросервиса в Люмене. Микросервис будет использовать 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]

...