Quickbooks Online - 如何在 Ruby/Rails 中使用 intuit 实现 SSO



我能够使用 Minimul/QboApi gem 连接到 Intuit,并根据 Github 上提供的示例获得使用 oauth2 的"连接到 Quickbooks"按钮。 但是,Gem 和示例都不显示如何使用 Intuit 实现单一登录。 在 Minimul 提供的示例中,"连接到 Quickbooks"按钮由 intuit 的 javascript 生成,网址为 https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere-1.3.5.js 以及安装脚本和标签。 该标记似乎已被弃用。或者至少,除了生成带有正确文本和徽标的按钮之外,它似乎没有做任何事情。

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

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

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

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

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>

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

问题是按钮的样式由生成的<a>标记内的class=intuitPlatformConnectButton属性设置样式,因此,如果您想要"使用 intuit 按钮登录"而不是"使用 intuit 连接"按钮,则需要将锚点上的类更改为class='intuitPlatformLoginButtonHorizontal',但仍需要附加到为<ipp:connecttointuit>定义的事件处理程序。 不需要用intuit.ipp.anywhere搞砸的最佳解决方案是创建连接按钮并将其隐藏,然后创建另一个样式为class=intuitPlatformLoginButtonHorizontal的标签,其点击事件调用单击隐藏的连接按钮。 我在登录页面上使用 AngularJs,所以我用ng-click处理点击,但可以简单地用 jquery 单独完成。

新.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 获取用户凭据。

最新更新