2012-04-04 11 views
7

私は数か月前にGoogle App Engineから移行しました。しかし、ユーザーはGAEのuser_id属性で識別されるため、認証には依然として頼りにしています。Google App EngineからGoogle OpenIDにユーザーを移行する

私の(今は外部の)アプリケーションは、暗号化された署名済みのタイムスタンプのあるログイン要求を使用して、ユーザーをGoogle App Engineアプリケーションにリダイレクトします。 GAEアプリケーションは、GAEの「ユーザー」サービスを使用してログインを実行します。 GAEに正常にログインすると、暗号化された署名済みのタイムスタンプ付きの応答を使用して、ユーザーは再び外部アプリケーションにリダイレクトされます。 初歩的な実装はherehereです。ご覧のとおり、これは非常に基本的なものであり、重大な暗号に依存してパフォーマンスが低下します。

私の外部アプリケーション(この場合はDjangoアプリケーション)は、user_idをuserテーブルのpasswordフィールドに格納しています。 user_idに加えて、私はDjangoにユーザー名と電子メールを保存するためにGAEからの電子メールアドレスを取得するだけです。

ここで、GAEサービスへの依存関係を削除したいと思います。おそらく最初のアプローチは、新しいパスワードを設定してDjangoを使って自分の認証を行うように要求する電子メールを各ユーザに送ることです。

GoogleのOpenIDサービスを利用して、ユーザーに実際に違いがないようにするソリューションを好むだろう。これはまた、GoogleカレンダーAPI用のAuthSubトークンを取得するために、ユーザーをGoogleに送信する必要があるため、これが好ましい

問題は、GAEを使用せずに特定のGoogleアカウントのGAE user_id属性を取得する方法が見つからないことです。 OpenIDと他のすべての認証プロトコルは異なる識別子を使用します。

ここで問題になるのは、私がまだ見ていないこの目的のために使用できるAPIはどれですか?ユーザーアカウントを移行する方法について他に解決策やアイデアはありますか?

ありがとうございます!

答えて

1

AFAIKは、GoogleアカウントとGoogle OpenIDの間の唯一の共通の識別子です。

  1. 現在のgae設定でユーザーがGoogleアカウントにログインしたときにメールを送信します。 User.email()を使用してください。このメールをユーザーデータとともに保存します。

  2. すべての(多くの)ユーザーのメールが届いたら、Google OpenIDに切り替えてください。ユーザーがログインすると、電子メールアドレスを取得し、このユーザーをデータベースで検索します。

+0

お返事ありがとうございます。この問題は、ユーザーがその間に自分のメールアドレスを変更している可能性があることです。たとえば、Gmail以外のアドレスからgmail、または他の非Gmailメールアドレスに変更した可能性があります。これまで経験したことがあり、ユーザーが私に連絡して古いアカウントと関連データを再リンクする方法を手動で提供する必要がありました。 user_idは決して変更されない静的な識別子であり、私は本当に後ろに誰も残されていないことを確認したいと思います。 – mback2k

0

Googleには、正常なOpenID認証リクエストでパラメータとして返される一意の識別子があります。* openid.claimed_id *。 OpenIDを使用するように切り替えると、ユーザが初めてログインメソッドを使用してログインするときに、このパラメータのuser_idを交換することができます。

認証プロセスのドキュメントの概要は、hereです。ハイブリッドOpenID + OAuthアプローチを使用して、リクエストトークンを特定のIDに関連付けることができるようにすることをお勧めします。その後、openid.claimed_idが元のリクエストトークンと一致することを確認します。

+0

ありがとうございます。はい。しかし、私は既存のユーザーを自分のアカウントとどのようにマッチングさせますか?要点は、電子メールアドレスまたはニックネームが一意かつ静的ではないということです。ユーザーベースのほぼ15%が非Gmail/googlemail.comアドレスを使用していますが、これらのアドレスはいつでも変更できます。 私は現在、ユーザー識別のための単一の要素としてuser_idを使用していますが、情報と連絡先のために電子メールとニックネームを保持しています。 – mback2k

+0

2つのアプローチが可能です。 1つは、システムに自分のアカウントを関連付けるだけで、初めてログインするすべてのGoogleアカウントです。移行期間中は、現在のメソッドを使用して最初にユーザーを認証し、次にOpenIDメソッドを使用して2回(より安全です)。 –

+0

もう1つの追加/明確化 - 移行を開始する前に独自の独自の識別子を生成し、今後はOpenIDベースの認証の検証以外の目的でGoogle識別子を使用しないでください。 –

2

これを行う最善の方法は、ユーザーに「移行」欄を表示して、Google OpenIDプロバイダにリダイレクトし、そこにログインするように促すことです。両方の場所でサインインしたら、2つのアカウントを照合して、今後それらをOpenID経由でログインさせることができます。あなたがハイブリッドアプローチしようとしないのはなぜ

+0

答えをありがとうが、私が今他のコメントで指摘したように、私は本当に移行期や移行期などを避けたいと思っています。そして、私も非人が残っていることを確認したい。 (おそらくあなたの解決策は良いと思いますが、そうでないかもしれません)。私がおそらく追加しなければならないことは、私のDjango auth_userテーブルのパスワードフィールドにuser_idを保存しても、user_idは暗号化されていないか、それらをOpenID識別子などに変換するAPIがあれば、簡単に移行できます。 – mback2k

+0

@ mback2kあなたが探しているものは存在しません。 App Engine Users APIによって返されるユーザーIDは内部識別子です。それに対する外部の対応や、それを外部の識別子に変換する方法はありません。 –

+0

さて、わかりました。答えをありがとう。これは、GAEチームが今後検討している可能性がありますか?オープンなデータのインポート/エクスポートと移行の取り組みの一環として、 – mback2k

1

:OpenIDを

    1. スイッチをご使用のアプリケーションが既にのuserIdを知っていれば、彼が持っている場合は、ユーザーに確認されていない場合、あなたは
    2. を行っています新しいアカウントを作成していない場合ははい、古いmechansimとし、ACOUNT
    3. ttransfer彼にログインした場合
    4. を移行するアカウント