Как связать приложение angular 2 с сервером spring-oauth2?

У меня есть oauth-сервер, защищенный с помощью "spring-cloud-oauth2" и "spring-cloud-security", и приложение является приложением с начальной загрузкой. Я пытаюсь получить access_token из приложения angular 2, т.е. я хочу войти в приложение angular 2. В моем oauth-сервере у меня есть client-id=microservice и client-secret=microservicesecret. Я проверил oauth-сервер от почтальона, где в разделе авторизации для имени пользователя и пароля я использую client-id и client-secret соответственно. А в разделе тела я использую grant_type= пароль, client_id=microservice, username=m@email.com, password=passw0rd, и все отлично работает.

Но у меня возникли проблемы с использованием конфигурации в приложении Angular 2. Я использовал следующие фрагменты кода.

userLogin(){
    console.log("In the userLogin()");
   var username:string='microservice';
   var password:string='microservicesecret';
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    headers.append('grant_type','password');
    headers.append('client_id','microservice');
    headers.append('client_secret','microservicesecret');
    headers.append('username',this.user.userEmail);
    headers.append('password',this.userPassword);
    console.log("User");
    console.log(this.user);
    console.log(headers);
    console.log( JSON.stringify({username:username,password:password}));
    var data = "username=" + username + "&password=" + password ;


    this.http
      .post(this.loginUrl,
      JSON.stringify({user,password}),
        {headers}
      )
      .map(res=>res.json())
      .map((res)=>{
        if(res.success){
          console.log("Success");
          localStorage.setItem('access_token',res.access_token);
          console.log("Access token");
          console.log(res.access_token);
        }
      });
  }

Здесь userEmail и userPassword вставляются пользователем. URL токена

loginUrl:string="http://localhost:9000/services/oauth/token";

Но я получаю ошибку 401. Мне нужно решение.

1 ответ

Решение

Вы пытались получить токен через Почтальона или что-то подобное. Есть много причин получить HTTP 401. Если вы разместите журнал сервера аутентификации Spring и запросите подробности, это будет более понятно.

Я делюсь своей функцией входа в систему, которая хорошо работает через Spring Boot Auth Server. Я использую авторизационный хедар с базовым токеном BASE64 вместо того, чтобы использовать "client_id" и "client_secrete".

public login(username: string, password: string): Observable<TokenModel> {
let headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
headers.append('Accept', 'application/json');
headers.append('Authorization', '**Basic BASE64TOKEN!!**');

let options = new RequestOptions({ headers: headers });

let params = new URLSearchParams();
params.append('username', username.valueOf());
params.append('password', password.valueOf());
params.append('scope', this.scope);
params.append('grant_type', this.grant_type);

return this.http.post(this.accessTokenUri, params.toString(), options)
  .map(response => { return <TokenModel>response.json(); })
  .do(token => {
    this.storageService.setStorage('id_token', token.access_token);
  })
  .catch(error => { return this.handleError(error); });

}

Другие вопросы по тегам