Quickbooks Online - Как реализовать единый вход с помощью интуитивно понятного языка в Ruby / Rails - PullRequest
0 голосов
/ 06 января 2019

Мне удалось подключиться к Intuit с помощью гема Minimul / QboApi и получить кнопку «Подключиться к Quickbooks», работающую с oauth2, на основе примера, предоставленного на Github. Однако ни самоцвет, ни примеры не показывают, как реализовать единый вход с помощью Intuit. В примере, предоставленном Minimul, кнопка «Подключиться к Quickbooks» создается с помощью javascript intuit, который находится по адресу https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere-1.3.5.js и сценарий установки и тег. Похоже, этот тег устарел. Или, по крайней мере, он не делает ничего, кроме как создать кнопку с нужным текстом и логотипом на ней.

Но суть в том, что мне не удалось найти какую-либо документацию по пакету ipp.anywhere.js, и я даже не уверен, что я собираюсь использовать с oauth2, поскольку она нигде не упоминается. Я считаю, что кнопка «Подключиться к интуитиву» делает правильные вещи, но правила кажутся довольно строгими в отношении того, что кнопка должна сказать правильно и иметь правильный логотип, иначе они отклонят ее в магазине. Похоже, они также предполагают, что пользователи с большей вероятностью попробуют что-нибудь, если включен SSO с рабочим процессом Intuit. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 06 января 2019

После некоторой дальнейшей работы я нашел решение, которое может создать «вход с помощью кнопки 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 для получения учетных данных пользователя.

...