3

外部ユーザーシステム(username / email / sessionId)を備えたGoogle Chrome拡張機能があり、ユーザーは自分で選択した資格情報(SSL経由)を使用してログインできます。これを次のようにGoogleOpenIDログインを使用するように変更したいと思います。

  1. ユーザーが[Google経由でログイン]をクリックします。
  2. 拡張機能はcheckid_immediate*ログイン要求を実行します:
    • checkid_immediateログインに失敗した場合 :
      1. checkid_setup拡張機能は、 **ログイン(および電子メールフェッチ)用に指定されたパラメーターで新しいタブを開きます。
      2. ユーザーがアカウントを選択し、私のサービスを承認します。
      3. リターンページで、OpenIDIDと電子メールをデータベースに保存します。
      4. Javascriptでタブを閉じます。
    • それ以外の場合は成功し、 OpenIDIDcheckid_immediateが返されます。
      1. データベースでOpenIDIDを探すことにより、どのユーザーを特定します。
  3. sessionIdユーザーにログインして、通常どおりに設定します。

私が理解している限りx-has-session、現在ログインしているユーザーのOpenIDを取得できます(以前にサービスにログインの使用を許可している場合)が、応答は常にopenid_mode=setup_neededです。

テストに自分のアカウントを使用すると、新しいtabcheckid_setupメソッドを使用して承認し、checkid_immediateXmlHttpRequestから正常な応答を得ることができます。ただし、これは、Googleから取得したOpenIDをopenid.claimed_idandopenid.identityパラメーターに挿入した場合にのみ可能です。

openid.identityおよびopenid.ui.modeパラメータに関係なく、要求は成功します。

私は自分に何ができるかを完全に誤解しましたx-has-sessionか?

はいの場合、checkid_immediate(新しいタブで開かずに)拡張機能からリクエストを実行する唯一の方法は、リクエストの実行時に取得したOpenID識別子を介して実行することcheckid_setupですか?


*checkid_immediateリクエストパラメータ(XMLHttpRequestを使用してPOSTリクエストとして送信されます):

var endpoint = "https://www.google.com/accounts/o8/ud";
var openIdParameters = {
  "openid.ns": "http://specs.openid.net/auth/2.0",
  "openid.mode": "checkid_immediate",
  "openid.return_to": "http://example.com/googleAuth.php",
  "openid.realm": "http://example.com",
  "openid.claimed_id": "http://specs.openid.net/auth/2.0/identifier_select",
  "openid.identity": "http://specs.openid.net/auth/2.0/identifier_select",
  "openid.ns.ui": "http://specs.openid.net/extensions/ui/1.0",
  "openid.ui.mode": "x-has-session"
};

URLでopenid.return_to私が行うのはjson_encode($_REQUEST)、XmlHttpRequestの応答としてフェッチされるecho(GET / POST変数のみ、Cookieは含まれていません)だけです。


*checkid_setupリクエストパラメータ(新しいタブで開きます):

var endpoint = "https://www.google.com/accounts/o8/ud";
var openIdParameters = {
  "openid.ns": "http://specs.openid.net/auth/2.0",
  "openid.mode": "checkid_setup",
  "openid.return_to": "http://example.com/googleAuth.php",
  "openid.realm": "http://example.com",
  "openid.claimed_id": "http://specs.openid.net/auth/2.0/identifier_select",
  "openid.identity": "http://specs.openid.net/auth/2.0/identifier_select",
  "openid.ns.ax": "http://openid.net/srv/ax/1.0",
  "openid.ax.mode": "fetch_request",
  "openid.ax.required": "email",
  "openid.ax.type.email": "http://axschema.org/contact/email"
};
4

1 に答える 1

3

さて、私はついに私のテストが奇妙に動作している理由を理解しました(そしてなぜx-has-sessionそれは何もしなかったように見えました):あなたが複数のアカウントでログインしている場合(私の場合)GoogleOpenIDログインは少し機能します別の方法で。

setup_needed違いを見てみましょう(これらの結果は私自身のテストで得られたものであるため、100%正確ではない可能性があります-切り替えなど、他に何もGoogleからの応答をトリガーしないと想定していますopenid.realm):


1: OpenIDを指定せず、x-has-session:を指定しない即時リクエスト

  • ログインしていません:openid_mode=setup_needed Googleは応答でパラメータを指定します。
  • 単一セッション:ユーザーがサービスを承認した場合、Googleはそれ以外のopenid_mode=id_res場合openid_mode=setup_neededは応答でパラメーターを指定します。
  • 複数のセッション:openid_mode=setup_needed Googleは、サービスを承認したかどうかに関係なく、応答でパラメータを指定します。

2: OpenIDを指定せず、x-has-session:を指定する即時リクエスト

  • ログインしていません:1と同じです(ログインしていません)。
  • シングルセッション:ユーザーがサービスを承認した場合、Googleはパラメーターを指定し、それ以外の場合は応答でopenid_mode=id_res無視します。x-has-sessionopenid_mode=setup_neededopenid_ext1_mode=x-has-session
  • 複数のセッション:openid_mode=setup_needed Googleは、サービスを承認したかどうかに関係なく、応答でパラメータを指定します。

3: OpenIDを指定し、指定しない即時リクエストx-has-session

  • ログインしていません:1と同じです(ログインしていません)。
  • シングルセッション:1(シングルセッション)と同じです。
  • 複数のセッション:単一のセッションと同じです。

4:x-has-session OpenIDと:を指定する即時リクエスト

  • ログインしていません:1と同じです(ログインしていません)。
  • シングルセッション:2(シングルセッション)と同じ。
  • 複数のセッション:単一のセッションと同じです。

言い換えると:

  • シングルセッションを使用している場合、即時モードを使用x-has-sessionすると、Googleユーザーがログインしているかどうかを通知するか、OpenIDを指定していなくても、ユーザーがすでにサービスを承認している場合は成功した応答を返すことができます。
  • 複数のセッションを使用してOpenIDを指定する場合、動作は単一セッションと同じです。
  • OpenIDイミディエイトモードを指定せずに複数のセッションを使用する場合、常に失敗応答が返され、x-has-session適用されません。
于 2012-12-06T12:37:52.357 に答える