Rails定制消费者oauth策略

时间:2012-11-20 17:11:49

标签: ruby-on-rails magento oauth

我是oauth和api整合的新手,我有一个地狱(我可以在这里说)一段时间试图找出它。

我想将我的rails应用程序连接到Magento(一个php电子商务购物车)。

他们在这里有一些基本的文档:

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

虽然我原则上理解oauth的想法,但我不知道如何实现自定义解决方案。我使用了一些宝石(例如:omniauth)连接到Twitter,这很好,但我不知道如何创建自己的连接到Magento的策略。

有谁知道怎么做?我可以在某个地方使用漫游或截屏吗?

如果没有,您可以推荐哪些工具或方法来解决问题 - 如果只是通过反复试验?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

以下是我创建的omniauth-magento gem / strategy的回购详细说明:

设置Magento

消费者密钥&秘密

在Magento中设置消费者并记下消费者密钥和消费者秘密

权限

在Magento Admin后端,转到系统> Web服务> REST角色,选择 Customer ,然后在 Customer 下勾选 Retrieve 。根据需要添加更多权限。

属性

在Magento Admin后端,转到系统> Web服务> REST属性,选择客户,并在电子邮件,名字姓氏 >客户>读。根据需要添加更多属性。

设置Rails

这些说明的部分内容基于这些OmniAuth instructions,如果您遇到问题,可以阅读这些说明。

设计

如果尚未安装,请安装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" } }

可选:如果您想使用Admin API(而不是Customer 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

用户模型&amp;表

以下是创建这些列后可以存储在User表中的有用Magento信息的示例:

  • 电子邮件
  • 如first_name
  • 姓氏
  • magento_id
  • magento_token
  • magento_secret

可选:您可能希望使用* attr_encrypted gem *加密* magento_token *和* magento_secret *(需要将magento_token重命名为encrypted_magento_token,将magento_secret重命名为encrypted_magento_secret)。

用户模型设置为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服务器

使用客户帐户登录Magento(如果您想使用Admin API,则使用管理员帐户登录)

在您的Rails应用中,转到您粘贴此行<%= link_to "Sign in with Magento", user_omniauth_authorize_path(:magento) %>

的视图

点击链接

现在,您应该被定向到Magento视图,系统会提示您授权访问Magento用户帐户

确认后,您应该登录Rails并重定向到上面指定的Rails回调URL。用户现在应该存储magento_id,magento_token和magento_secret。

进行API调用

创建一个使用magento_token和magento_secret的类来执行API调用,例如* lib / magento_inspector.rb *。例如:

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

扩展课程以满足您的需求

答案 1 :(得分:1)

当我听到M字(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, linked here这样的gem。还有其他人 - 检查The Ruby Toolbox for more

这会让你开始吗?