经过一些进一步的工作,我想出了一个可以创建“使用因纽特人按钮登录”的解决方案,尽管它有点像 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 内的事件处理程序将自身附加到单击事件。
问题是按钮的样式是由生成的<a> 标记内的class=intuitPlatformConnectButton 属性设置的,所以如果你想要一个“使用直觉按钮登录而不是使用直觉按钮连接”,则锚上的类需要是更改为class='intuitPlatformLoginButtonHorizontal' 但仍需要附加到为<ipp:connecttointuit> 定义的事件处理程序。不需要与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 获取用户凭据。