2009-04-22 10 views
9

登録ユーザーがコンテンツを作成またはアップロードできるようにするアプリケーションを開発しており、匿名ユーザーがそのコンテンツを閲覧し、登録ユーザーのページを閲覧してそのコンテンツを見つけることができます。たとえば、Flickrのようなサイトでは、ユーザーがユーザーのページをブラウズできるようになります。Google App Engineでユニークで不透明なユーザーIDを生成する

これを行うには、匿名HTTP GETリクエストでユーザーを識別する方法が必要です。ユーザーはhttp://myapplication.com/browse/<userid>/<contentid>と入力して正しいページにアクセスできるはずです。プライバシーの理由から、一意である必要がありますが、ユーザーの電子メールアドレスのようなものであってはなりません。

Google App Engineを通じて、ユーザーに関連付けられた電子メールアドレスを取得できますが、私が言ったように、私はそれを使いたくありません。自分のアプリケーションのユーザーに登録時に一意のユーザー名を指定させることができますが、可能な限りそのオプションを作成して登録プロセスができるだけ短くなるようにしたいと思います。

もう1つの方法は、登録プロセス中にランダムなクッキー(GUID?)を生成し、これを使用して、データベースへの移動なしにそのようなクッキーの一意性を保証する明白な方法は見当たりません。

このように使用できるオブジェクトの一意の識別子をApp Engineユーザオブジェクトで取得する方法はありますか?

私はPythonソリューションを探しています - GAEもJavaをサポートしていることを忘れていました。それでも、言語にかかわらず、技術は似ていると思います。

答えて

7

あなたのタイミングは完璧です:ちょうど昨日、SDKの新しいリリースが出て、unique, permanent user IDsをサポートしました。彼らはあなたが指定したすべての基準を満たしています。

+0

"現在のユーザーがサインインしていない場合、ユーザーコンストラクターはUserNotFoundErrorを発生させます。つまり、Googleにログインする必要があります。ただし、Googleのログインメカニズムを使用すると、特にユーザーの期待に合わせて、自分自身をロールオーバーするよりも効果的です。 – Mark

+1

しかし、user_idが世界的に一意である可能性があります。これはうまくいかないでしょう。 – Mark

+0

これはまさに私が探しているもののようです。私はGoogleのサインインを使用していますが、世界固有のuser_idが実際には要件です。完璧。 –

1

session cookiesを意味しますか?

はDzinXが言っ


http://code.google.com/p/gaeutilities/を試してみてください。データベースラウンドトリップなしで認証できる不透明なキーを作成する唯一の方法は、暗号化または暗号化ハッシュを使用することです。

ユーザに乱数を与え、ハッシュまたは秘密鍵で暗号化します。 (小さな)衝突のリスクはまだありますが、キーの作成時にデータベースに触れ、衝突の際に乱数を変更することで回避できます。乱数が暗号であることを確認し、選択された平文攻撃を防ぐために長いサーバー側の乱数を追加します。

あなたはGoogle Docsキーのようなトークンになります。基本的には、ユーザーが認証されていることを証明する署名で、データベースに触れることなく検証できます。

しかし、GAEの価格とbigtableの速度を考えると、本当にGoogle独自の認証を使用できない場合は、セッションIDを使用するほうがよいでしょう。

+0

いいえ、私はセッションクッキーを意味しません。 GAEはすでにログインしているユーザーを追跡するためのものです。私の質問は、匿名ユーザーと、登録ユーザーに関連付けられているコンテンツとのやりとりを具体的に扱っています。 –

+0

私の提案は、ログインしていないユーザーにgaeutilitiesを使用することです。 – Mark

+0

ログインしていないユーザーは、完全にステートレスな方法でアプリケーションとやりとりするので、実際には適用されません。ポインタをありがとう、しかし - それは便利なライブラリのように見えます。 –

3

は、私は、ユーザーの2種類を区別すべきだと思う:

1)Googleアカウント経由でログインしているか、それはすでにGoogle以外のメールアドレス

を使用してサイトに登録しているユーザー2)初めてサイトを開いたユーザーで、ログインしていないユーザー

2番目のケースでは、ランダムな文字列を生成する以外の方法はありません(例:uuid.uuid4()またはこのユーザーのセッションCookieからキー)、匿名ユーザーは自分自身に固有の情報を持ちません。

ただし、ログインしているユーザーの場合、固有の識別子(電子メールアドレス)が既に設定されています。私はあなたのプライバシーに関する懸念に同意します。それを識別子として使用しないでください。代わりに、と思われる文字列を生成すると、がランダムに表示されますが、実際には電子メールアドレスから生成されますか?ハッシュ関数はこの目的には最適です。例:hashlib.sha1として

>>> import hashlib 

>>> email = '[email protected]' 
>>> salt = 'SomeLongStringThatWillBeAppendedToEachEmail' 

>>> key = hashlib.sha1('%s$%s' % (email, salt)).hexdigest() 
>>> print key 
f6cd3459f9a39c97635c652884b3e328f05be0f7 

はランダム関数ではなく、与えられたデータのために常に同じ結果を返しますが、実質的に不可逆的であることが証明され、あなたが安全にユーザーの電子を損なうことなく、ウェブサイト上でハッシュされたキーを提示することができます-メールアドレス。また、異なる電子メールの2つのハッシュが同じになることはないと仮定できます(可能性もありますが、起こる確率は非常に小さい)。ハッシュ関数の詳細については、the Wikipedia entryを参照してください。

+0

私はハッシングを考えましたが、衝突の可能性のために私をあまり買わないでしょう(しかし、堅牢なプログラムでチェックする必要があります)。データベースへのラウンドトリップが必要です。ランダムなIDとそれをチェックしてください。それはまさに私が避けようとしていたものです。 認証されていないユーザーは、コンテンツを生成できないため、問題はありません。 –

関連する問題