После некоторой дальнейшей работы я нашел решение, которое может создать «вход с помощью кнопки Inuit», хотя это немного похоже на взлом javascript. Во-первых, я решил, что единственное, что мне действительно нужно изменить, - это изображение кнопки. В остальном код `работает нормально для" входа в систему с интуитивно-понятным интерфейсом "или" подключения к интуитивному рабочему процессу ". Единственная проблема - изображение кнопки.
Вот код (адаптированный из Minimul / QboApi ) для получения токенов доступа и обновления oauth2 с помощью кнопки «Подключиться к Quickbooks».
Настройка в коде контроллера в логине или сеансе контроллера:
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
присоединяется к событию click.
Проблема заключается в том, что кнопка стилизована атрибутом class=intuitPlatformConnectButton
внутри сгенерированного тега <a>
, поэтому, если вы хотите использовать кнопку «Войти с помощью кнопки intuit вместо кнопки с подключением с помощью intuit», класс на привязке должен быть изменен на class='intuitPlatformLoginButtonHorizontal'
, но все еще должен подключаться к обработчику событий, определенному для <ipp:connecttointuit>
. Лучшее решение, которое не требует перебора с intuit.ipp.anywhere
, - это создать кнопку подключения и скрыть ее, а затем создать еще один тег со стилем class=intuitPlatformLoginButtonHorizontal
, чье событие click вызывает click для скрытой кнопки подключения. Я использую 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 для получения учетных данных пользователя.