Laravel - socket - ratchet - api authentication

7 浏览
0 Comments

Laravel - socket - ratchet - api authentication

我为一个正在开发的iOS应用程序开发了一个Laravel REST API(由另一个人开发)。这意味着没有Web部分,应用程序通过CURL请求与API进行通信。尽管使用了cookies。

现在我需要检查在线/离线用户的状态,这就是使用socket的地方。我不明白如何在socket连接上对用户进行身份验证。

我找到的所有示例中,JS脚本通过PHP会话和cookies处理Laravel的身份验证。

所以在我的REST API场景中,iOS应用程序获取ACCESS_TOKEN,我可以在socket中稍后使用它。

一个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'

此时,我已经有了访问令牌,并且想要打开一个socket连接。

根据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
/* 
在这里,我必须以某种方式获取用户ACCESS_TOKEN
并且检查授权的方式与使用CURL传递ACCESS_TOKEN在标题中检查的方式相同
像这样
$user = Auth::user();
if (!emtpy($user))
{
// 检查例如用户权限(授权),如果没问题则允许连接
}
else
{
// 拒绝连接
}
*/
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})\n";
    }
...

据我所了解,客户端可以将JSON字符串传递给socket连接。服务器可以查询我的laravel数据库中的oauth_access_tokens获取ACCESS_TOKEN并获取用户模型并加载相应的用户数据。但我认为这不是正确的方式,因为我想要使用Laravel的guard/middleware和其他我不太熟悉但我感觉非常需要的功能。所以我想通过让laravel来完成工作来检查身份验证,而不是手动检查。

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

0
0 Comments

问题的原因是作者需要在没有浏览器的情况下进行授权的socket连接(使用Ratchet),而JavaScript代码没有运行。所以作者不能使用Ratchet WebSocket,只能使用简单的socket Ratchet IoServer。作者的API控制器返回JSON,这样在进一步处理响应时很方便。作者主要需要这种方法来验证socket连接,假设客户端在打开socket时知道访问令牌(通过登录时的REST获得)。用户通过telnet连接并发送一个包含令牌的JSON字符串。根据API控制器的响应(如果认证失败则为false,如果认证成功则为当前用户),可以决定是否对$ conn进行身份验证。这里还有一个更具体的问题,帮助解答这个问题:Call Laravel controller from code and pass HTTP headers to it

解决方法是使用Ratchet来处理socket连接,并使用API控制器来验证连接的身份。作者使用telnet来模拟socket连接,并通过发送包含访问令牌的JSON字符串来验证身份。作者提到的Ratchet服务器类的实现可以在这里找到。通过调用API控制器并根据其响应来决定连接是否已经通过身份验证。对于此问题的回答可以在这里找到。

0