Laravel - socket - ratchet - api authentication

时间:2017-07-07 09:31:47

标签: laravel sockets authentication authorization ratchet

我为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格式数据。在棘轮组件接口实现 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后卫/中间件的所有功能以及我不熟悉的其他功能,但我觉得非常需要。所以我想不是用手检查身份验证,而是让laravel完成工作。

我知道这个话题Laravel Ratchet socket Auth,但它说的是会话和请求cookie,这在我的情况下是不可能的。

1 个答案:

答案 0 :(得分:0)

所以这就是我的解决方案的样子。

我需要这种方法在无浏览器的套接字连接(Ratchet)中进行授权,其中JS代码没有运行。所以我不能使用Ratchet WebSocket,只能使用简单的插槽Ratchet IoServer。

我的API控制器返回JSON,因此可以更轻松地使用响应。

我需要这种方法主要是对套接字连接进行身份验证,假设客户端在打开套接字时知道访问令牌(在登录时通过REST获取)。

用户通过telnet连接并发布包含令牌的JSON字符串。唉,我没有管理

telnet 192.168.0.100 8080

{"token":"ACCESS_TOKEN"}

棘轮服务器类看起来像这里描述的那样 Call Laravel controller from code and pass HTTP headers to it

因此,根据我的API控制器响应(如果验证错误或当前用户),我可以决定$ conn是否也经过身份验证。

这是另一个较窄的问题,帮助回答这个问题:Call Laravel controller from code and pass HTTP headers to it