Как связать приложение 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); });
}