私が作成した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の下のEmail、First 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
ニーズに合わせてクラスを拡張