Lumen 5.5 Session store не установлен по запросу

Я использую vue-authenticate ( https://github.com/dgrubelic/vue-authenticate) для создания двух видов подключения к нашему веб-сервису, первый метод - это подключение к его учетной записи, второй - добавление учетной записи, когда связано.

Я использую Lumen (от Laravel) для бэкенда и управления соединениями в PHP.

Только сеансы недоступны в Lumen. Как сохранить временные учетные данные?

use League\OAuth1\Client\Server\Twitter;

public function login(Request $request)
{
    try {

        $this->server = new Twitter([
            'identifier' => $this->key,
            'secret' => $this->secret,
            'callback_uri' => $request->get('redirectUri'), // Variable getted from POST
        ]);

        if(empty($request->get('oauth_token'))) {
            $temporaryCredentials = $this->server->getTemporaryCredentials();

            $request->session()->put('temporary_credentials', serialize($temporaryCredentials)); // Session doesn't works

            return response()->json([
                'oauth_token' => $temporaryCredentials->getIdentifier(),
                'oauth_token_secret' => $temporaryCredentials->getSecret(),
            ], 200);
        } else {
            // I must have oauth_token here with session
        }

    } catch (\Exception $e) {
        return response()->json($e->getMessage(), 500);
    }
}

1 ответ

Решение

Я думаю, вы просто неправильно поняли концепцию веб-службы (API). API не является приложением с состоянием, скорее это состояние без состояния, что означает отсутствие сеанса для каждого запроса. Таким образом, в основной структуре API сессия не поддерживается (официально). Чтобы решить вашу проблему, вы можете сохранить свои временные учетные данные в базе данных или, возможно, в кэше (с TTL, например: 60 минут), например:

$requestIdentifier = $request->getClientIdentifier(); // YOU SHOULD IMPLEMENT THIS METHOD

Cache::put($requestIdentifier, $temporaryCredentials, 60);

Чтобы восстановить ваш кеш, просто используйте:

$temporaryCredentials = Cache::get($requestIdentifier);

Здесь я даю вам некоторое представление, когда вы реализуете getClientIdentifierВы можете заставить клиента отправлять уникальный ключ внутри вашего заголовка, например:

axios.post('http://somewhere', {
    headers: {
        'x-request-identifier': UNIQUE_ID
    }
})

В вашем API:

$requestIdentifier = $request->header('x-request-identifier');
Другие вопросы по тегам