私の Yii Web サービスを iPhone アプリケーション用に保護したいと考えています。
システムを使用するためにログインは必須ではありません。ゲスト ユーザーもシステムを使用できます。サーバー側でセッション処理を実装して、Web サービス リクエストを管理および認証する方法を知りたいです。ユーザーは複数の電話からログインすることもでき、それらを処理する必要があります。異なるセッションとして。どうすればこれを解決できますか..どんな助けでも大歓迎です..
ありがとう!
私の Yii Web サービスを iPhone アプリケーション用に保護したいと考えています。
システムを使用するためにログインは必須ではありません。ゲスト ユーザーもシステムを使用できます。サーバー側でセッション処理を実装して、Web サービス リクエストを管理および認証する方法を知りたいです。ユーザーは複数の電話からログインすることもでき、それらを処理する必要があります。異なるセッションとして。どうすればこれを解決できますか..どんな助けでも大歓迎です..
ありがとう!
接続はステートレスになるため、セッションを使用してユーザーを認証することはできません。最善の方法は、ユーザーが自分自身を認証するときにユーザー固有のトークンを生成することです。トークンはサーバーによって生成され、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);
}
アプリの実行内容によっては、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 サービス タイプの単純な要求には十分です。それが役に立てば幸い