2012-11-16 37 views
0

我想確保我的Yii web服務爲iphone應用程序。如何通過會話處理來保護php -YII Weservices?

登錄不是強制使用系統,訪客用戶也可以使用系統。我想知道如何在服務器端實現會話處理來管理和驗證Web服務請求。用戶甚至可以從多個電話登錄他們應該被視爲不同的會議。我如何解決此..任何幫助將不勝感激。

謝謝!

回答

2

由於連接將是無狀態的,因此無法使用會話來驗證用戶身份。 最好的辦法是在用戶驗證自己身份時生成用戶特定的令牌。 該令牌由服務器生成並與expiration_time一起存儲在數據庫(或文件)中。

然後,在所有其他請求中,用戶將發送他的令牌作爲請求中的參數。 在服務器端,您必須檢查:令牌是否存在並且尚未過期。

令牌生成的一個例子:

/** 
    * Generate a token to authentify the user in later api calls. 
    * @param string the secret needed to generate the token 
    * @return string the Token 
    */ 
    public static function generateToken($secret) { 
     $str = ""; 
     for ($i=0; $i<8; $i++) { 
     $str .= Token::rand_alphanumeric(); 
     } 
     return $str . md5($str . $secret); 
    } 


/** 
    * Generate a random alphanumeric char. 
    * @return the char 
    */ 
    private static function rand_alphanumeric() 
{ 
    $subsets[0] = array('min' => 48, 'max' => 57); // ascii digits 
    $subsets[1] = array('min' => 65, 'max' => 90); // ascii lowercase English letters 
    $subsets[2] = array('min' => 97, 'max' => 122); // ascii uppercase English letters 

    // random choice between lowercase, uppercase, and digits 
    $s = rand(0, 2); 
    $ascii_code = rand($subsets[$s]['min'], $subsets[$s]['max']); 

    return chr($ascii_code); 
} 

和驗證:

/** 
* Check if the token is valid (depending on user hash). 
* @param string the secret used to generate the token 
* @param string the token 
* @return boolean if the token is valid or not 
*/ 
public static function validateToken($secret, $str) 
{ 
    $rs = substr($str, 0, 8); 
    return $str == $rs . md5($rs . $secret); 
} 
1

取決於你的應用程序將要幹什麼,你可能不會需要登錄的用戶在網絡服務器上。例如,如果您想在打開應用程序時更新用戶提要(在iPhone應用程序中)或更改應用程序中的其他視圖,則可以使用帶有簡單加密密鑰系統的Web服務。

例如,在iPhone應用程序中,用戶將登錄並進行某種會話。當您在服務器上的URL的請求,你會通過用戶ID(如存儲在Web服務器上),以及它們的ID的加密值+密鑰,如:

http://mywebserver.com/webseriver/updatefeed?user_id=10&key=ccbe688c7a3e3e1ebbaec12da992ded5 

在服務器然後你可以_GET $ user_ID的,並創建USER_ID的MD5哈希和密鑰:

if (md5($_GET['user_id']."mysecretkey") == $_GET['key']){ 
    // valid request 
} 

與客人,你可以只發送USER_ID爲0

顯然,這不是一個對於每種場景都有足夠強大的解決方案,但對於簡單的web服務類型來說,這通常足夠好要求。希望它有幫助