6

短い形式の質問: 管理領域のMagentoでGoogleApiOAuth2認証を実装するための最もクリーンな方法は何ですか

長い形式の質問: すべての新しいGoogleAPIはOAuth2を使用しています。phpクライアントライブラリはここにあり、OAuth2処理を抽象化し ますhttps://code.google.com/p/google-api-php-client/

プロセスは簡単です

  • ユーザーはAccessTokenを持っていますか?
  • いいえ
  • クライアントライブラリを使用してログインURLを作成します
  • ユーザーがログインURLリンクをクリックすると、Googleにログインできます。
  • 認証されると、Googleは指定されたリダイレクトURLを介してMagentoにリダイレクトします
  • GoogleはURLの一部としてAccessTokenを送り返します。保管してください。
  • このAccessTokenを使用してさまざまなAPIを呼び出します

クライアントライブラリの例はすべてフラットファイルです。だから私はそれをMVC構造に適合させるための最良の方法を探しています...正確にはMagentoです。

具体的にしましょう。Googleの連絡先を取得します。これまでのところ:

  • インデックスアクションを持つContactsControllerと呼ばれる管理コントローラー。最初に行うことは、アクセストークンがあるかどうかを確認することです。アクセストークンがない場合は、認証アクションに転送されます。
  • authアクションは、google phpクライアントライブラリ「createAuthUrl()」によって生成されたAuthUrlを持つブロックをレンダリングするだけです。
  • リンクをクリックすると、グーグルのログインページが読み込まれ、ログインします
  • Googleは、コードで指定したURL(およびGoogle APIコンソールhttps://code.google.com/apis/console)にリダイレクトします。また、Accessトークンを返します。このURLは予測可能である必要があるため、管理領域のURLにすることはできません。これらは、「キー」URLパラメーターに依存しているためです。したがって、Googleがリダイレクトするフロントエンドコントローラーとアクションを作成しました。
  • フロントエンドコントローラーにAccessTokenを保存します。
  • 次に、管理コントローラーのContactsControllerインデックスアクションにリダイレクトします。AccessTokenを認識し、アプリケーションは実際にいくつかのことを実行できます。

私が抱えている問題は、その最終的なリダイレクトを実行できないことです。'key' urlパラメーターを追加するadminhtmlヘルパーgetUrlメソッドを使用していますが、フロントエンドからバックエンドにリダイレクトすると、ダッシュボードにキックされます。

MagentoでGoogleのOAuth2を実装するためのより良い方法はありますか?

直接管理URLにリダイレクトするにはどうすればよいですか?

4

1 に答える 1

2

ログインリンクをレンダリングするだけの認証アクション全体は無意味でした。

adminhtml_contacts / indexアクションは、アクセストークンがないことを認識するとすぐに、Google_Client::createAuthUrlを使用してユーザーの送信先を特定できるようになります。では、なぜわざわざこれを実際のリンクに入れるのでしょうか。代わりに、すぐにauthUrlにリダイレクトします。

ユーザーがすでにGoogleにログインしている場合は、何もする必要はありません。Googleは、それらがログインしていることを確認し、すぐに指定された(そして予測可能な)フロントエンドコントローラーアクションにリダイレクトします。

このフロントエンドコントローラーアクションはアクセストークンを保存し、adminhtml_contacts/indexアクションにリダイレクトします。上記で指定した「キー」URLパラメータのクロスサイトリクエストフォージェリ保護の問題が原因で、引き続き問題が発生します。

これを回避するために、管理コントローラーのpreDispatchフックを使用して、このアクションのためだけに秘密鍵をオフにしました。

public function preDispatch()
{ 
     if ($this->getRequest()->getActionName() == 'index') Mage::getSingleton('adminhtml/url')->turnOffSecretKey();
     parent::preDispatch();
}

これは理想的ではありませんが、機能します。つまり、認証をいじくり回すのではなく、実際にAPIで作業を開始できます。

ここで、クライアントの抽象化がないContacts APIを理解するために、SimpleXml名前空間の問題と面倒なDOMDocument操作について深く掘り下げる必要があります。やあ、ほら。

于 2013-01-29T23:27:25.327 に答える