【发布时间】:2017-12-11 13:11:33
【问题描述】:
我为 iOS 应用程序开发了一个 Laravel REST API(由另一个人开发)。这意味着根本没有 Web 部件,应用程序通过 CURL 请求与 API 进行通信。虽然使用了 cookie。
现在我需要检查在线/离线用户状态,socket 来自哪里。而且我无法理解如何在套接字连接上对用户进行身份验证。
在所有示例中,我设法找到一个 JS 脚本通过 PHP 会话和 cookie 在 Laravel 处理身份验证。
所以在我的 REST API 场景中,iOS 应用程序获得了 ACCESS_TOKEN,我以后可以在套接字中使用它。
CURL 请求 POST 登录名和密码并以 JSON 格式获取访问令牌 格式化并刷新 cookie 中的令牌。
curl -kX POST https://site/login -b cookies.txt -c cookies.txt -D headers.txt -H 'Content-Type:application/json' -d '
{
"username":"gruzua",
"password":"qwerty09876",
}'
回应
JSON 部分
{
"access_token":"ACCESS_TOKEN",
"expires_in":600,
}
Cookie 部分(以防万一):
HTTP/1.1 200 OK
Server: nginx/1.10.3
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-cache, private
Date: Wed, 17 May 2017 17:08:09 GMT
Set-Cookie: refreshToken=SOME_REFRESH_TOKEN; expires=Mon, 07-Jan-2019 17:08:09 GMT; Max-Age=51840000; path=/; HttpOnly
在每个后续请求中,CURL 将 ACCESS_TOKEN 令牌发送到 验证
curl -kX GET https://site/user -H 'Authorization: Bearer ACCESS_TOKEN'
此时我有一个访问令牌并想打开一个套接字连接。
根据http://socketo.me/docs/hello-world,我可以打开一个 telnet 连接并在那里写入一些包含我的 ACCESS_TOKEN 的 JSON 格式的数据。在服务器端,在 Ratchet ComponentInterface 实现 onOpen 方法中,我必须检查用户授权。也许不可能onOpen,那么选项是onMessage?反正
我的问题是这里如何使用 laravel 认证?
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface {
protected $clients;
public function __construct() {
$this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
// Store the new connection to send messages to later
/*
Here I have to get somehow the user ACCESS_TOKEN
and to check authorization the way it's checked
when using CURL passes ACCESS_TOKEN in header
Something like this
$user = Auth::user();
if (!emtpy($user))
{
// Check e.g. user permissions (authorization) and allow connection if it's ok
}
else
{
// Reject connection
}
*/
$this->clients->attach($conn);
echo "New connection! ({$conn->resourceId})\n";
}
...
据我了解,客户端可以将 JSON 字符串传递给套接字连接。我可以在我的 oauth_access_tokens laravel 数据库中查询 ACCESS_TOKEN 并获取我的用户模型并加载相应的用户数据的服务器。但我认为这不是正确的方法,因为我想使用 Laravel 保护/中间件的所有功能以及我不熟悉的其他 coll 东西,但我觉得它非常需要。所以我不想手动检查身份验证,而是让 laravel 完成这项工作。
我知道这个主题 Laravel Ratchet socket Auth ,但它谈到了会话和请求 cookie,这在我的情况下是不可能的。
【问题讨论】:
标签: laravel sockets authentication authorization ratchet