Lumen 5.5会话存储未按要求设置

时间:2017-10-31 17:22:54

标签: vue.js lumen lumen-5.3 lumen-5.4

我使用vue-authenticate(https://github.com/dgrubelic/vue-authenticate)在我们的Web服务上创建两种连接,第一种方法是连接到他的帐户,第二种方法是连接时添加帐户。

我使用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 个答案:

答案 0 :(得分:0)

我认为你只是误解了Web服务(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');