2017-07-07 55 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