0

私の Yii Web サービスを iPhone アプリケーション用に保護したいと考えています。

システムを使用するためにログインは必須ではありません。ゲスト ユーザーもシステムを使用できます。サーバー側でセッション処理を実装して、Web サービス リクエストを管理および認証する方法を知りたいです。ユーザーは複数の電話からログインすることもでき、それらを処理する必要があります。異なるセッションとして。どうすればこれを解決できますか..どんな助けでも大歓迎です..

ありがとう!

4

2 に答える 2

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);
}
于 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

サーバーでは、user_id を $_GET し、user_id と秘密鍵の md5 ハッシュを作成できます。

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

ゲストでは、user_id を 0 として送信できます。

明らかに、これはすべてのシナリオに対して十分に堅牢なソリューションではありませんが、通常、Web サービス タイプの単純な要求には十分です。それが役に立てば幸い

于 2012-11-16T08:42:12.470 に答える