【问题标题】:OAuth install - how to create a session that persists across requests?OAuth 安装 - 如何创建跨请求持续存在的会话?
【发布时间】:2019-12-20 12:09:33
【问题描述】:

我正在尝试实现 OAuth 协议,以便可以在我的 Rails 6 应用程序中将 Shopify API 作为第三方 API 服务进行访问。

我能够通过 OAuth 流程完成 3/4,但我似乎无法发出从我的 Rails 应用程序发送到 Shopify 的 POST 请求。我是 Rails 和后端开发的新手,所以可能会发生很多问题。

现在,代码使用shopify_api gem 来完成这一切。我不确定如何实例化会话,以便它跨操作引用相同的会话。我有一个before_action,每次使用该控制器时都会调用它,而不管操作如何。所以每当它是一个新动作时,它都会创建一个新会话(我认为这就是正在发生的事情 - 我不确定我是否使用正确的语言来描述这一点)。我不知道在哪里定义 shopify_session 变量,以便它在每个操作中都有效。代码如下:

class ShopifyController < ApplicationController
  before_action :shopify_session

  def install
    scope = ["write_orders,read_customers"]

    permission_url = @shopify_session.create_permission_url(scope, "https://#{APP_URL}/shopify/auth")

    redirect_to permission_url
  end

  def auth
    token = @shopify_session.request_token(request.params)
  end

private
  def shopify_session
    ShopifyAPI::Session.setup(api_key: API_KEY, secret: API_SECRET)

    shop = request.params['shop']

    @shopify_session = ShopifyAPI::Session.new(domain: "#{shop}", api_version: "2019-07", token: nil)
  end
end

上面的代码返回:

ShopifyAPI::ValidationException in ShopifyController#auth
Invalid Signature: Possible malicious login

我的 ngrok 日志说:

POST /shopify/auth             500 Internal Server Error                        
GET  /shopify/auth             200 OK                                           
GET  /shopify/install          302 Found

也可能存在 CORS 错误。浏览器标头检查说: Referrer Policy: strict-origin-when-cross-origin

此外,它似乎可能正在向自己发布,而不是向 Shopify 发送请求。我认为那是因为在我看来,我有以下代码:

<%= button_to 'Confirm Account', shopify_auth_url %>

我不知道如何触发 POST 请求以发送到 Shopify...再说一次,我是 Rails 和后端的新手——我主要了解前端。

【问题讨论】:

    标签: ruby-on-rails ruby oauth shopify pundit


    【解决方案1】:

    我认为问题在于您可能希望在 ApplicationController 中使用此 Shopify 身份验证逻辑,以便可以在所有控制器之间共享。

    另外,不确定你在用shopify_auth_url 做什么。你定义了那条路线吗?

    【讨论】:

    • 我可以重构逻辑并把它放在那里,我只是想先让握手工作,然后再用干净的代码。我的路线可能是错误的。我已经定义了那条路线,但它没有做我想做的事。如何使用button_to 向第三方发送帖子?
    • shopify_auth_url 是 rails 告诉我的,我可能希望 button_to 路由到,但它会在实际应用程序本身而不是 shopify 上发布帖子。我不知道如何让 rails 在应用程序之外发送帖子
    • 与 javascript fetch 等效的 rails 是什么?
    • 另外,您如何让会话在操作之间保持不变?
    • 查看 Rails 路由的工作原理 - guides.rubyonrails.org/routing.html - 你需要在你的 routes.rb 中定义一个路由,然后你可以在按钮上使用它。它也可以是一个 href 而不必是一个按钮。
    【解决方案2】:

    如果有人在 Shopify 中努力实现 OAuth,或者尝试在 Rails 中处理出站 HTTP 请求并碰巧读到了这篇文章...

    我缺乏 Rails 知识导致了这个问题。事实证明,我已经坚持了一个半月,并且一直在工作。我正在通过我的浏览器开发工具查看我的服务器日志和网络请求,期望找到我的应用程序 POST 到 Shopify。但是,该 POST 是一个出站 HTTP 请求,Rails 只记录入站请求。此外,客户端的浏览器不会处理该请求,因为该请求在后台,服务器到服务器(如果我错了,请纠正我?)。

    我通过在token = @shopify_session.request_token(request.params) 之后添加puts token 实现了这一点,并发现我一直在收到令牌。我应该在一开始就这样做——一次粗心的事故和痛苦的教训。我使用了一个名为 http_logger 的 gem,它记录任何出站 HTTP 请求。如果有人知道在 Rails 控制器(或任何地方)中访问出站 HTTP 请求的更好方法,请告诉我!谢谢。

    ps,这里是我的问题的更简洁版本:https://github.com/Shopify/shopify_api/issues/619

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-29
      • 2018-05-05
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多