我想为 iphone 应用程序保护我的 Yii 网络服务。
使用系统不需要登录,来宾用户也可以使用系统。我想知道如何在服务器端实现会话处理来管理和验证网络服务请求。用户甚至可以从多部手机登录,他们应该被对待作为不同的会话。我该如何解决这个问题..任何帮助将不胜感激..
谢谢!
我想为 iphone 应用程序保护我的 Yii 网络服务。
使用系统不需要登录,来宾用户也可以使用系统。我想知道如何在服务器端实现会话处理来管理和验证网络服务请求。用户甚至可以从多部手机登录,他们应该被对待作为不同的会话。我该如何解决这个问题..任何帮助将不胜感激..
谢谢!
由于连接将是无状态的,因此您不能使用会话来验证用户。最好的办法是在用户对自己进行身份验证时生成用户特定的令牌。令牌由服务器生成并与过期时间一起存储在数据库(或文件)中。
然后在所有其他请求中,用户将其令牌作为请求中的参数发送。在服务器端,您必须检查:令牌是否存在且未过期。
令牌生成示例:
/**
* 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);
}
根据您的应用程序将要执行的操作,您可能不需要在 Web 服务器上登录用户。例如,如果您想在用户打开应用程序时更新用户提要(在 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 服务类型的简单请求,它通常已经足够好了。希望能帮助到你