#node.js #angular #jwt #token #amazon-cognito
#node.js #angular #jwt #токен #amazon-cognito
Вопрос:
Архитектура: интерфейс Angular, серверная часть nodejs / express.
В настоящее время настройка работает следующим образом:
- Войдите на сайт через размещенный в Cognito пользовательский интерфейс
- Это перенаправляет на нашу домашнюю страницу и отправляет нам код в URL
- Я удаляю этот код в Angular
import { Component, OnInit } from '@angular/core';
import { DbService } from '../db.service';
import { Iss } from '../db.service';
import { Router, ActivatedRoute } from '@angular/router';
import { Http, Response, RequestOptions, Headers} from '@angular/http';
@Component({
selector: 'app-dashboard'
})
export class GroupSelectionComponent implements OnInit {
cognitoCode: string;
constructor(
private DbService: DbService,
private route: ActivatedRoute,
private router: Router
) {}
ngOnInit() {
this.route.queryParams
.subscribe(params => {
console.log(params);
console.log(params.code);
this.cognitoCode = params.code;
});
this.DbService.getIss(this.cognitoCode).subscribe(
iss => this.iss = iss
);
}
В коде, который вы увидите, я передаю congitocode в dbservice для getIss.
db.service
getIss(cognitoCode ): Observable<Issuer[]> {
const url = hosturl 'i_l';
// let header: HttpHeaders = new HttpHeaders();
const httpOptions = {
headers: new HttpHeaders({
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json',
'Authorization': cognitoCode
})
};
let params = new HttpParams()
console.log(httpOptions.headers);
return this._http.get(url, httpOptions)
.pipe(
map((res) => {
console.log(res);
return <Issuer[]> res;
})
);
}
Затем я отправляю код как часть заголовков моего запроса GET на серверную часть.
Затем GET попадает на мой серверный маршрутизатор с этими настройками.
var authMiddleware = require('../middleware/AuthMiddleware.js');
router.get('/i_l', authMiddleware.Validate, i_l.get);
Затем это вызовет мое программное обеспечение authMiddleware, которое принимает код, предоставленный размещенным в Cognito пользовательским интерфейсом, и использует POST для oauth2 / token, чтобы получить мой токен JWT.
Затем этот токен анализируется и используется для сравнения с https://cognito-idp.us-east-2.amazonaws.com/REMOVED/.well-known/jwks.json для конгнито.
После проверки запрос продолжается, и я получаю данные обратно из серверной части.
// POST that trades the code for a token with cognito
var options = {
'method': 'POST',
'url': 'https://REMOVED.amazoncognito.com/oauth2/token',
'headers': {
'Content-Type': 'application/x-www-form-urlencoded'
},
form: {
'grant_type': 'authorization_code',
'client_id': 'CLIENTIDREMOVED',
'code': req.headers['authorization'],
'redirect_uri': 'http://localhost/group-selection'
}
};
// First request gets the JSON request of the token using the POST above
request(options, function (error, response) {
if (error) throw new Error(error);
token = JSON.parse(response.body).access_token;
//localStorage.setItem('token', token);
// request pull down status based on validitiy of token
request({
url : `https://cognito-idp.us-east-2.amazonaws.com/REMOVED/.well-known/jwks.json`,
json : true
}, function(error, response, body){
console.log('token: ' token);
if (!error amp;amp; response.statusCode === 200) {
pems = {};
var keys = body['keys'];
for(var i = 0; i < keys.length; i ) {
var key_id = keys[i].kid;
var modulus = keys[i].n;
var exponent = keys[i].e;
var key_type = keys[i].kty;
var jwk = { kty: key_type, n: modulus, e: exponent};
var pem = jwkToPem(jwk);
pems[key_id] = pem;
}
var decodedJwt = jwt.decode(token, {complete: true});
if (!decodedJwt) {
console.log("Not a valid JWT token");
res.status(401);
return res.send("Not a valid JWT token");
}
var kid = decodedJwt.header.kid;
var pem = pems[kid];
if (!pem) {
console.log('Invalid token - decodedJwt.header.kid');
res.status(401);
return res.send("Invalid token - decodedJwt.header.kid");
}
jwt.verify(token, pem, function(err, payload) {
if(err) {
console.log("Invalid Token - verify");
res.status(401);
return res.send("Invalid token - verify");
} else {
console.log("Valid Token.");
return next();
}
});
} else {
console.log("Error! Unable to download JWKs");
res.status(500);
return res.send("Error! Unable to download JWKs");
}
});
});
Вопрос — как я настроил это так, чтобы токен, который я получаю обратно, продолжался для пользователя?
Ответ №1:
Если я правильно понял ваш вопрос, то вы пытаетесь проверить все свои API-интерфейсы через пользователя cognito, верно? Затем вам просто нужно сделать две вещи.
- Добавьте в заголовок токен JWT, как только вы получите после входа в систему. Просто сохраните в своей области приложения и передавайте каждый раз, когда вызывается какой-либо API.
Auth.signIn(data.username, data.password)
.then(user => {
let jwkToken = user.getSignInUserSession().getAccessToken().getJwtToken();
// Store above value in singletone object or application scope.
})
.catch(err => {
//error
});
Теперь, когда API вызывает передачу jwkToken в качестве заголовка.
- Затем перейдите в консоль AWS APIGateway и добавьте в авторизаторы.
Комментарии:
1. Спасибо за ваш ответ — в какой части кода это будет жить?
2. Вы принимаете меры по авторизации? Пожалуйста, укажите. Я реализовал для своего проекта и настроил его. Так что, безусловно, есть некоторая разница с вашим приложением. Но если вам нужен код, я должен отправить вам изображение или отфильтрованный код.