Как мне сохранить токен JWT после получения от Cognito? Вход в систему через размещенный в Cognito пользовательский интерфейс

#node.js #angular #jwt #token #amazon-cognito

#node.js #angular #jwt #токен #amazon-cognito

Вопрос:

Архитектура: интерфейс Angular, серверная часть nodejs / express.

В настоящее время настройка работает следующим образом:

  1. Войдите на сайт через размещенный в Cognito пользовательский интерфейс
  2. Это перенаправляет на нашу домашнюю страницу и отправляет нам код в URL
  3. Я удаляю этот код в 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, верно? Затем вам просто нужно сделать две вещи.

  1. Добавьте в заголовок токен 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 в качестве заголовка.

  1. Затем перейдите в консоль AWS APIGateway и добавьте в авторизаторы.

Комментарии:

1. Спасибо за ваш ответ — в какой части кода это будет жить?

2. Вы принимаете меры по авторизации? Пожалуйста, укажите. Я реализовал для своего проекта и настроил его. Так что, безусловно, есть некоторая разница с вашим приложением. Но если вам нужен код, я должен отправить вам изображение или отфильтрованный код.