Как получить доступ к hperledger composer REST API через веб-приложение angular 4 - PullRequest
0 голосов
/ 09 мая 2018

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

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

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

Кто-нибудь выполнял или делал такой тип аутентификации при входе пользователя в систему для hyperledger composer?

Ответы [ 2 ]

0 голосов
/ 20 июля 2018

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

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

Это аутентифицирует пользователя с помощью API оставления композитора и устанавливает куки сеанса в браузере.

Теперь, если вы нажмете на 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 () и присоединения слушателей. Не входите и не выходите через гапи.

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

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();
}
0 голосов
/ 09 мая 2018

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

например

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 })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...