0

我想为 iphone 应用程序保护我的 Yii 网络服务。

使用系统不需要登录,来宾用户也可以使用系统。我想知道如何在服务器端实现会话处理来管理和验证网络服务请求。用户甚至可以从多部手机登录,他们应该被对待作为不同的会话。我该如何解决这个问题..任何帮助将不胜感激..

谢谢!

4

2 回答 2

2

由于连接将是无状态的,因此您不能使用会话来验证用户。最好的办法是在用户对自己进行身份验证时生成用户特定的令牌。令牌由服务器生成并与过期时间一起存储在数据库(或文件)中。

然后在所有其他请求中,用户将其令牌作为请求中的参数发送。在服务器端,您必须检查:令牌是否存在且未过期。

令牌生成示例:

    /**
    * 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);
}
于 2012-11-16T08:37:23.937 回答
1

根据您的应用程序将要执行的操作,您可能不需要在 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 服务类型的简单请求,它通常已经足够好了。希望能帮助到你

于 2012-11-16T08:42:12.470 回答