未根据要求设置 Lumen 5.5 会话存储
Lumen 5.5 Session store not set on request
我用vue-authenticate(https://github.com/dgrubelic/vue-authenticate)在我们的web服务上建立了两种连接,第一种是连接到他的账号,第二种是连接时添加账号。
我在 PHP 中使用 Lumen(来自 Laravel)进行后端和连接管理。
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);
}
}
我认为您只是误解了 Web 服务的概念 (API)。 API 不是有状态应用程序,而是无状态应用程序,意味着每个请求都没有可用的 session。因此,在主要的 API 框架中,不支持 session(官方)。要处理您的问题,您可以将临时凭证存储在数据库中或缓存中(使用 TTL,例如:60 分钟),如下所示:
$requestIdentifier = $request->getClientIdentifier(); // YOU SHOULD IMPLEMENT THIS METHOD
Cache::put($requestIdentifier, $temporaryCredentials, 60);
要检索您的缓存,只需使用:
$temporaryCredentials = Cache::get($requestIdentifier);
在这里我给你一些想法,当你实现getClientIdentifier
时,你可以强制客户端在你的header中发送一个唯一的密钥,比如:
axios.post('http://somewhere', {
headers: {
'x-request-identifier': UNIQUE_ID
}
})
在你的API中:
$requestIdentifier = $request->header('x-request-identifier');
我用vue-authenticate(https://github.com/dgrubelic/vue-authenticate)在我们的web服务上建立了两种连接,第一种是连接到他的账号,第二种是连接时添加账号。
我在 PHP 中使用 Lumen(来自 Laravel)进行后端和连接管理。
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);
}
}
我认为您只是误解了 Web 服务的概念 (API)。 API 不是有状态应用程序,而是无状态应用程序,意味着每个请求都没有可用的 session。因此,在主要的 API 框架中,不支持 session(官方)。要处理您的问题,您可以将临时凭证存储在数据库中或缓存中(使用 TTL,例如:60 分钟),如下所示:
$requestIdentifier = $request->getClientIdentifier(); // YOU SHOULD IMPLEMENT THIS METHOD
Cache::put($requestIdentifier, $temporaryCredentials, 60);
要检索您的缓存,只需使用:
$temporaryCredentials = Cache::get($requestIdentifier);
在这里我给你一些想法,当你实现getClientIdentifier
时,你可以强制客户端在你的header中发送一个唯一的密钥,比如:
axios.post('http://somewhere', {
headers: {
'x-request-identifier': UNIQUE_ID
}
})
在你的API中:
$requestIdentifier = $request->header('x-request-identifier');