2017-07-07 43 views
0

我为iOS应用程序开发了一个Laravel REST API(由另一个人开发)。这意味着根本没有Web部件,应用程序通过CURL请求与API进行通信。虽然使用了Cookie。Laravel - socket - 棘轮 - api身份验证

现在我需要检查在线/离线用户状态,其中套接字来。我无法理解我如何在套接字连接上验证用户身份。

在所有示例中,我设法找到一个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, 
} 

饼干部分(以防万一):

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 

在每个本身quent要求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 guard/middleware和其他科尔的所有功能,但我不太需要它,但我觉得它非常需要。所以我想通过手工来验证认证,但是让laravel来完成这项工作。

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

回答

0

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

我需要这种方法来授权在没有浏览器的套接字连接(棘轮),其中JS代码没有运行。所以我不能使用棘轮WebSocket,只有简单的套接字棘轮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