Nano Hash - криптовалюты, майнинг, программирование

Как получить доступ к REST API hperledger composer через веб-приложение angular 4

В настоящее время мы создаем веб-приложение, используя angular 4 и композитор Hyperledger. Сервер REST включен с аутентификацией Google oAuth. И выполнили все связанные с этим настройки на https://console.developers.google.com/

Сценарий заключается в том, что пользователь войдет в систему со своей собственной учетной записью gmail и должен иметь доступ к REST API композитора гиперледжера. В основном выполнение этого руководства с веб-приложением https://hyperledger.github.io/composer/latest/tutorials/google_oauth2_rest.

Но проблема в том, что когда пользователь вошел в систему через веб-браузер с помощью углового веб-приложения, мы получаем токен от Google, но я не могу получить доступ к REST API. Он прекрасно работает на http://localhost:3000 . Но когда я пробую это из веб-приложения или через почтальона, это вообще не работает.

Кто-нибудь выполнял или выполнял такой тип аутентификации пользователя для Hyperledger Composer?


Ответы:


1

В вашем клиенте Angular (т. е. аутентифицированном клиенте) вам необходимо убедиться, что параметр withCredentials установлен, чтобы создать файл cookie для передачи токена аутентификации на сервер REST.

eg

headers.set('Content-Type', 'multipart/form-data');

return this.httpClient.post('http://localhost:3000/api/wallet/import', formData, {withCredentials: true, headers}).toPromise();

Теперь клиент аутентифицирован на сервере REST, и в кошелек добавлена ​​идентификация (посредством импорта), теперь можно вызывать конечные точки бизнес-сети: например, вызов запроса или /GET — несколько примеров ниже:

return this.httpClient.get('http://localhost:3000/api/queries/myQuery', {withCredentials: true}).toPromise();

return this.httpClient.get('http://localhost:3000/api/Commodity', {withCredentials: true}).toPromise();

this.http.get('http://mydomain:3000/api/MyAsset', { withCredentials: true })
09.05.2018
  • Я использовал gapi/auth2 на стороне клиента. Мы получаем токен доступа в объекте, и когда мы вошли в google, мы получаем json, содержащий эти параметры: { issue_to, Audience, user_id, scope, expires_in, email, Verified_email, access_type } И нам нужно правильно передать access_token? И мы проверяем токен, используя эту ссылку googleapis.com/oauth2/v1/tokeninfo?access_token. = ТОКЕН ДОСТУПА 10.05.2018
  • Итак, мой вопрос заключается в том, как преобразовать этот объект в формат, который будет совместим с файлом cookie. Я пробовал encodeURIComponent() для этого, но он не работает. Формат, который я проверил на REST-сервере Hyperledger Composer, отличается. Файл cookie содержит идентификатор пользователя и токен доступа, а также еще один параметр, но я не могу его распознать. Итак, как я могу получить этот формат? Так что не могли бы вы помочь мне с этим .. 10.05.2018

  • 2

    Аутентифицируйте свое угловое приложение, используя:

     <a id="googleLogin" href="http://domain:3000/auth/google">Log In</a>
    

    Это аутентифицирует пользователя с API отдыха композитора и устанавливает файлы cookie сеанса в браузере.

    Теперь, если вы нажмете API-интерфейс кошелька с помощью {withCreditails:true}, он сработает.

    this.http.get('http://domain:3000/api/wallet', { withCredentials: true })
    

    Для выхода:

    <a id="googleLogin" href="domain:3000/auth/logout/auth/logout" (click)='logout()'>Logout</a>
    

    Для доступа к профилю пользователя, вошедшего в систему, используйте gapi с тем же ClientID, но используйте его только для init() и присоединения слушателей. Не входите и не выходите из системы через gapi.

    Я реализовал это решение и отлично работает.

    declare
    const gapi: any;
    googleUser: any;
    public auth2: any;
    private clientId: string = 'YOUR-CLIENT-ID.apps.googleusercontent.com';
    private scope = [
      'https://www.googleapis.com/auth/plus.login'
    ].join(' ');
    
    public googleInit() {
      if (gapi) {
        gapi.load('auth2', () => {
          this.auth2 = gapi.auth2.init({
            client_id: this.clientId,
            scope: this.scope
          });
          this.attachSignin(document.getElementById('googleLogin'));
          this.init();
        });
      } else {
        setTimeout(() => {
          this.googleInit();
        }, 500);
      }
    }
    
    public attachSignin(element) {
      this.auth2.attachClickHandler(element, {},
        (googleUser) => {
          let profile = googleUser.getBasicProfile();
          console.log('Token || ' + googleUser.getAuthResponse().id_token);
          console.log('ID: ' + profile.getId());
          // ...
        },
        function(error) {
          console.log(JSON.stringify(error, undefined, 2));
        });
    }
    
    init() {
      this.auth2.isSignedIn.listen(this.signinChanged);
      this.auth2.currentUser.listen(this.userChanged);
      this.refreshValues();
    }
    
    signinChanged = (val) => {
      console.log('google ### signinChanged', val);
    }
    /**
     * Listener method for when the user changes.
     *
     * @param {GoogleUser} user the updated user.
     */
    userChanged = (user) => {
      console.log('google ### User now: ', user);
      this.googleUser = user;
      this.updateGoogleUser();
    };
    
    updateGoogleUser() {
      console.log('google ### user', this.googleUser);
      if (this.googleUser && this.googleUser.w3 && this.googleUser.Zi) {
        let userProfile: UserProfile = {
          id: this.googleUser.El,
          name: this.googleUser.w3.ig,
          email: this.googleUser.w3.U3,
          image: this.googleUser.w3.Paa,
          token: this.googleUser.Zi.access_token,
          idToken: this.googleUser.Zi.id_token,
          provider: this.googleUser.Zi.idpId
        }
        localStorage.setItem('profile', JSON.stringify(userProfile));
      }
    }
    
    refreshValues = () => {
      if (this.auth2) {
        console.log('google ### Refreshing values...');
    
        this.googleUser = this.auth2.currentUser.get();
    
        this.updateGoogleUser();
      }
    }
    logout() {
      this.auth2.signOut();
    }

    20.07.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..