我是oauth和api整合的新手,我有一个地狱(我可以在这里说)一段时间试图找出它。
我想将我的rails应用程序连接到Magento(一个php电子商务购物车)。
他们在这里有一些基本的文档:
http://www.magentocommerce.com/api/rest/authentication/oauth_authentication.html
虽然我原则上理解oauth的想法,但我不知道如何实现自定义解决方案。我使用了一些宝石(例如:omniauth)连接到Twitter,这很好,但我不知道如何创建自己的连接到Magento的策略。
有谁知道怎么做?我可以在某个地方使用漫游或截屏吗?
如果没有,您可以推荐哪些工具或方法来解决问题 - 如果只是通过反复试验?
提前感谢您的帮助!
答案 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信息的示例:
可选:您可能希望使用* 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。
这会让你开始吗?