我正在使用Ruby on Rails,并连接到我的应用程序中的Shopify REST Admin API,以检索商店信息。我们使用Shopify OAuth2 gem,它使用OmniAuth中间件处理API的身份验证和访问范围:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :shopify,
ENV["SHOPIFY_API_KEY"],
ENV["SHOPIFY_API_SECRET"],
scope: 'read_orders,read_products',
setup: lambda { |env|
strategy = env['omniauth.strategy']
shopify_auth_params = Rack::Utils.parse_query(env['QUERY_STRING'])
shop = if shopify_auth_params.present?
"https://#{shopify_auth_params['shop']}"
else
''
end
strategy.options[:client_options][:site] = shop
}
end
我想更改身份验证期间发送到Shopify的范围,因此某些商店获得一组范围,而另一家商店获得另一组。例如,某些商店将请求范围:
read_orders, read_products
另一家商店要求:
read_orders, read_products, read_inventory
这样做的原因是允许用户选择自己想升级应用程序的时间,而不必在更改应用程序所需的范围时进行选择。
如何动态传递其他信息?
答案 0 :(得分:0)
用不同的术语来考虑可能会更明智。您可能不想在区分应用程序的世界中使用范围。相反,您将专注于交付给商家的实际功能。支付更多,获得更多。因此,当您安装该应用程序时,为了使您的生活更轻松,所有安装都具有一套范围。您可以避免可怕的模式弹出窗口稍后再请求新的作用域,这可能会导致混乱和卸载。
即使受限制最大的应用程序具有最大范围,如果您设计应用程序以限制其功能,商人也将无法执行任何操作。因此,您可能仅希望将其内置到您的App中。您可以通过检查应用程序当前正在支付的订阅计划来决定应用程序将交付什么,而不必担心范围。
TL:DR;使用范围来决定您的应用程序做什么是一个坏主意。
答案 1 :(得分:0)
我通过遵循以下GitHub问题来解决此问题:https://github.com/Shopify/omniauth-shopify-oauth2/issues/60
您可以在整个会话中动态传递范围,并在OmniAuth的设置块中进行设置:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :shopify,
ShopifyApp.configuration.api_key,
ShopifyApp.configuration.secret,
setup: lambda { |env|
strategy = env['omniauth.strategy']
session = strategy.session.with_indifferent_access
env['omniauth.strategy'].options[:scope] = session['shopify.oauth.scope']
...
}