2

私は oauth と api の統合に慣れていないので、それを理解しようとして非常に苦労しています (ここで言えますか)。

Rails アプリを Magento (PHP の e コマース カート) に接続したいと考えています。

彼らはここにいくつかの基本的なドキュメントを持っています:

http://www.magentocommerce.com/api/rest/authentication/oauth_authentication.html

原則として oauth の考え方は理解していますが、カスタム ソリューションを実装する方法がわかりません。Twitter に接続するためにいくつかの gem (例: omniauth) を使用しましたが、それは問題ありませんでしたが、Magento に接続するための独自の戦略を作成する方法がわかりません。

誰もそれを行う方法を知っていますか? 使用できるウォークスルーまたはスクリーンキャストはありますか?

そうでない場合、それを理解するためにどのツールまたはアプローチをお勧めしますか?

よろしくお願いします。

4

2 に答える 2

2

私が作成したomniauth-magento gem/strategyのリポジトリからの詳細な手順は次のとおりです。

マジェントのセットアップ

コンシューマ キーとシークレット

Magento でコンシューマーをセットアップし、コンシューマー キーとコンシューマー シークレットを書き留めます。

特権

Magento Admin バックエンドで、System > Web Services > REST Rolesに移動し、 Customerを選択して、 Customerの下のRetrieveにチェックマークを付けます。必要に応じて権限を追加します。

属性

Magento Admin バックエンドで、System > Web Services > REST Attributesに移動し、 Customerを選択し、 Customer > Readの下のEmailFirst name、およびLast nameにチェックマークを付けます。必要に応じて属性を追加します。

Railsのセットアップ

これらの手順の一部はOmniAuth の手順に基づいており、行き詰まった場合に読むことができます。

工夫する

まだインストールしていない場合はDeviseをインストールしてください

この行をroutes.rbに追加/置き換えます。これは、Magento が正常に承認されて Rails アプリに戻ると呼び出されます。

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks"}

Magento oAuth 戦略

このライブラリを Gemfile にロードしてgem "omniauth-magento"実行しますbundle install

config/initializers/devise.rb を変更します:

Devise.setup do |config|
  # deactivate SSL on development environment
  OpenSSL::SSL::VERIFY_PEER ||= OpenSSL::SSL::VERIFY_NONE if Rails.env.development? 
  config.omniauth :magento,
    "ENTER_YOUR_MAGENTO_CONSUMER_KEY",
    "ENTER_YOUR_MAGENTO_CONSUMER_SECRET",
    { :client_options => { :site => "ENTER_YOUR_MAGENTO_URL_WITHOUT_TRAILING_SLASH" } }
  # example:
  # config.omniauth :magento, "12a3", "45e6", { :client_options =>  { :site => "http://localhost/magento" } }

オプション: (Customer API ではなく) Admin API を使用する場合は、次のようにデフォルトの authorize_path を上書きする必要があります。

{ :client_options => { :authorize_path => "/admin/oauth_authorize", :site => ENTER_YOUR_MAGENTO_URL_WITHOUT_TRAILING_SLASH } }

フォルダーcontrollersで、サブフォルダーusersを作成します

そのサブフォルダーapp/controllers/users/で、次のコードでファイル *omniauth_callbacks_controller.rb* を作成します。

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def magento
    # You need to implement the method below in your model (e.g. app/models/user.rb)
    @user = User.find_for_magento_oauth(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated
      set_flash_message(:notice, :success, :kind => "magento") if is_navigational_format?
    else
      session["devise.magento_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end

ユーザーモデルとテーブル

これらの列を作成したら、User テーブルに保存できる便利な Magento 情報の例を次に示します。

  • Eメール
  • ファーストネーム
  • 苗字
  • magento_id
  • magento_token
  • magento_secret

オプション: たとえば、*magento_token* と *magento_secret* を *attr_encrypted gem* で暗号化することもできます (magento_token を encrypted_magento_token に、magento_secret を encrypted_magento_secret に名前変更する必要があります)。

Userモデルを に設定し、omniauthable :omniauthable, :omniauth_providers => [:magento]認証に成功した後に取得した情報を保存するメソッドを作成します。

class User < ActiveRecord::Base  
  devise :database_authenticatable, :registerable, :recoverable,
         :rememberable, :trackable, :validatable, :timeoutable,
         :omniauthable, :omniauth_providers => [:magento]  

  def self.find_for_magento_oauth(auth, signed_in_resource=nil)
    user = User.find_by(email: auth.info.email)
    if !user
      user = User.create!(
        first_name: auth.info.first_name,                           
        last_name:  auth.info.last_name,
        magento_id: auth.uid,
        magento_token: auth.credentials.token,
        magento_secret: auth.credentials.secret,
        email:      auth.info.email,
        password:   Devise.friendly_token[0,20]
      )
    else
      user.update!(
        magento_id: auth.uid,
        magento_token: auth.credentials.token,
        magento_secret: auth.credentials.secret
      )
    end    
    user
  end         
end

認証を開始するためのリンク

この行をビューに追加します<%= link_to "Sign in with Magento", user_omniauth_authorize_path(:magento) %>

認証中

Rails サーバーを起動する

Magento サーバーを起動します

顧客アカウント (管理 API を使用する場合は管理者アカウント) で Magento にログインします。

Rails アプリで、この行を貼り付けたビューに移動します<%= link_to "Sign in with Magento", user_omniauth_authorize_path(:magento) %>

リンクをクリックしてください

Magento ビューが表示され、Magento ユーザー アカウントへのアクセスを承認するよう求められます。

確認したら、Rails にログインし、上記で指定した Rails コールバック URL にリダイレクトする必要があります。ユーザーには、magento_id、magento_token、および magento_secret が保存されているはずです。

API 呼び出しの実行

*lib/magento_inspector.rb* で、magento_token と magento_secret を使用して API 呼び出しを行うクラスを作成します。例:

class MagentoInspector
  require "oauth"
  require "omniauth"
  require "multi_json"

  def initialize
    @access_token = prepare_access_token(current_user) # or pass user in initialize method 
    @response = MultiJson.decode(@access_token.get("/api/rest/customers").body) # or pass query in initialize method, make sure privileges and attributes are enabled for query (see section at top)
  end

private

  # from http://behindtechlines.com/2011/08/using-the-tumblr-api-v2-on-rails-with-omniauth/
  def prepare_access_token(user)
    consumer = OAuth::Consumer.new("ENTER_YOUR_MAGENTO_CONSUMER_KEY", "ENTER_YOUR_MAGENTO_CONSUMER_SECRET", {:site => "ENTER_YOUR_MAGENTO_URL_WITHOUT_TRAILING_SLASH"})
    token_hash = {:oauth_token => user.magento_token, :oauth_token_secret => user.magento_secret}
    access_token = OAuth::AccessToken.from_hash(consumer, token_hash)
  end
end

このクラスが配置されているフォルダーに Rails がファイルをロードすることを確認します。lib フォルダーの場合、これをconfig/application.rbに入れます。config.autoload_paths += Dir["#{config.root}/lib/**/"]

クエリを実行MagentoInspector.new

ニーズに合わせてクラスを拡張

于 2014-02-05T03:16:24.087 に答える
1

M ワード (Magento) を聞くと、このような喉音の反応が得られます。Magento を何か便利なものにしようと数か月を費やした結果です。しかし...選択の余地がないと仮定し、Magento が標準の OAuth サーバーを提供すると仮定すると、OmniAuth を使用して Mag...blurrgh..ento に接続できるはずです。

Magento は、client_id と client_secret という複数のトークンを提供する必要があります。これらを使用して、アプリのアクセス トークンを要求します。一度手に入れたら、半永久的に再利用できます。OmniAuth がその手助けになるかもしれません。

アクセス トークンAuthentication: OAuth <access-token>を取得したら、サービスに対して行うすべての要求と同様の HTTP ヘッダーを渡す必要があります。

サーバーへの要求は、標準の https (vs http) を使用して行われます。Rails 内で (Net::HTTP などを使用して) 独自の REST クライアントを展開することもできますが、ここにリンクされている RestClientのような gem を見つけることもできます。他にもあります。詳細については、Ruby ツールボックスを確認してください。

それで始められますか?

于 2012-11-20T18:40:28.353 に答える