我能够使用 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 获取用户凭据。