【问题标题】:Quickbooks Online - How to implement SSO with intuit in Ruby/RailsQuickbooks Online - 如何在 Ruby/Rails 中使用 intuit 实现 SSO
【发布时间】:2019-01-06 04:01:40
【问题描述】:

我能够使用 Minimul/QboApi gem 连接到 Intuit,并根据 Github 上提供的示例获得使用 oauth2 的“连接到 Quickbooks”按钮。然而,gem 和示例都没有显示如何使用 Intuit 实现单点登录。在 Minimul 提供的示例中,Connect To Quickbooks 按钮由 intuit 的 javascript 生成,位于 https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere-1.3.5.js 和一个设置脚本和标签。该标签似乎已被弃用。或者至少,除了生成带有正确文本和徽标的按钮之外,它似乎没有做任何事情。

但最重要的是,我无法找到有关 ipp.anywhere.js 包的任何文档,甚至不确定我是否打算与 oauth2 一起使用,因为它没有在任何地方提及。我相信 Connect to intuit 按钮可以做正确的事情,但是对于按钮需要说出正确的内容并具有正确的徽标的准则似乎非常严格,否则他们会在商店中拒绝它。他们似乎还暗示,如果启用了带有 Intuit 工作流的 SSO,用户更有可能尝试某些东西。任何帮助表示赞赏。

【问题讨论】:

    标签: ruby-on-rails intuit-partner-platform quickbooks-online


    【解决方案1】:

    经过一些进一步的工作,我想出了一个可以创建“使用因纽特人按钮登录”的解决方案,尽管它有点像 javascript hack。首先,我确定我唯一真正需要更改的是按钮图像。在其他方面,` 后面的代码适用于“使用 intuit 登录”或“连接到 intuit 工作流程”。唯一的问题是按钮图像。

    这是通过“连接到 Quickbooks”按钮获取访问权限和 oauth2 刷新令牌的代码(改编自 Minimul/QboApi)。

    在登录或会​​话控制器的控制器代码中设置:

    def new
      @app_center = QboApi::APP_CENTER_BASE # "https://appcenter.intuit.com" 
      state= SecureRandom.uuid.to_s
      intuit_id = ENV["CLIENT_ID"]
      intuit_secret = ENV["CLIENT_SECRET"]
      client = Rack::OAuth2::Client.new(
        identifier: intuit_id,
        secret: intuit_secret,
        redirect_uri: ENV["OAUTH_REDIRECT_URL"],
        uthorization_endpoint:"https://appcenter.intuit.com/connect/oauth2",
        token_endpoint: "https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer",
        response_type: "code"
      )
      #make sure to include at least "openid profile email" 
      #in the scope to you can retrieve user info.
      @uri = client.authorization_uri(scope: 'com.intuit.quickbooks.accounting openid profile email phone address', state: state)
    end
    

    这是在视图上生成按钮所需的代码。 (视图也需要加载 jquery 才能使脚本正常工作。)

    <script type="text/javascript" src="<%= @app_center %>/Content/IA/intuit.ipp.anywhere-1.3.5.js">
    </script>
    <script>
        intuit.ipp.anywhere.setup({
            grantUrl: "<%== @uri %>",
            datasources: {
                quickbooks: true,
                payments: false
            }
        });
    </script>
    <div>
     <ipp:connecttointuit></ipp:connecttointuit>
    

    此代码在交付给客户端的页面上生成以下 html:

    <ipp:connecttointuit>
       <a href="javascript:void(0)" class="intuitPlatformConnectButton">Connect with QuickBooks</a>
    </ipp:connecttointuit>
    

    此代码生成一个带有 Connect with QuickBooks 图像的按钮,intuit.ipp.anywhere-1.3.5.js 内的事件处理程序将自身附加到单击事件。

    问题是按钮的样式是由生成的&lt;a&gt; 标记内的class=intuitPlatformConnectButton 属性设置的,所以如果你想要一个“使用直觉按钮登录而不是使用直觉按钮连接”,则锚上的类需要是更改为class='intuitPlatformLoginButtonHorizontal' 但仍需要附加到为&lt;ipp:connecttointuit&gt; 定义的事件处理程序。不需要与intuit.ipp.anywhere 混淆的最佳解决方案是创建连接按钮并将其隐藏,然后创建另一个样式为class=intuitPlatformLoginButtonHorizontal,其点击事件调用点击隐藏的连接按钮。我在登录页面上使用 AngularJs,所以我使用 ng-click 处理点击,但可以仅使用 jquery 完成。

    new.html.erb:

    <div>
       <a href="javascript:void(0)"  ng-class="'intuitPlatformLoginButtonHorizontal'"ng-click="intuit_login()"></a>
    </div>
    <div>
       <ipp:connecttointuit id="connectToIntuit" ng-hide="true"><  </ipp:connecttointuit>
    </div>
    

    和控制器代码:

     $scope.intuit_login = function() {
       let el = angular.element("#connectToIntuit:first-child")
       el[0].firstChild.click();
     }
    

    这将导致身份验证后重定向到提供的重定向 url,您可以在其中使用 openid 获取用户凭据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2020-08-27
      相关资源
      最近更新 更多