1
votes

Impossible de configurer amazon-cognito-auth-js sur l'application angular 4 avec le fournisseur d'identité SAML

J'essaie d'intégrer le fournisseur de services SAML à AWS cognito pool.J'ai parcouru de nombreux documents et essayé de mettre en œuvre .Cependant, la redirection ne se produit pas lorsque je clique sur la connexion. [scénario est qu'il devrait rediriger vers la page de connexion Microsoft ] Le pool Cognito et les fournisseurs d'identité sont correctement configurés. Le problème survient lorsque je dois m'authentifier à partir de l'application frontale quelqu'un pourrait-il s'il vous plaît m'aider à rectifier la même chose ..? voici mon code

étape 1:

login() {
   var auth = new CognitoAuth(this.authData);
   console.log("hello");
   auth.userhandler = {
    onSuccess: function(result) {
        alert("Sign in success");       
    },
    onFailure: function(err) {
        alert("Error!");
    }
};

étape 2: ajouter la ligne ci-dessous dans angularcli.json

<button (click)="login()">click</button>

étape3: app.component.ts

authData = {
    ClientId : '2*********************u',
    AppWebDomain : 'https://myApplication***********.com',
    TokenScopesArray : ['email'], 
    RedirectUriSignIn : 'https//google.com',
    RedirectUriSignOut : 'https//google.com',
    IdentityProvider : 'SAML', // e.g. 'Facebook',
    UserPoolId : 'ap-south-1_****' // Your user pool id here
};

étape 4:

import {CognitoAuth} from 'amazon-cognito-auth-js';

étape 5: dans app.html

"../node_modules/amazon-cognito-auth-js/dist/amazon-cognito-auth.js",
"../node_modules/amazon-cognito-auth-js/dist/amazon-cognito-auth.min.js.map",
"../node_modules/amazon-cognito-auth-js/dist/aws-cognito-sdk.js"

étape 6:

npm install amazon-cognito-auth-js --save

mon problème vient ici lorsque je clique sur le bouton de connexion, la page ne redirige pas. S'il vous plaît, aidez-moi


7 commentaires

y a-t-il une erreur de sortie dans la console?


malheureusement pas d'erreur ..


J'ai un exemple de travail qui est en pur js. J'essaye de le convertir en version angulaire mais je n'ai pas pu le faire.


Quelle est la sortie de console.log (CognitoAuth) ?


voici git repo github.com/UWFosterIT/aws-cognito/ blob / master / static / index.h‌ tml qui fonctionne correctement mais en pur javascript.


consoler CognitoAuth renvoyer une fonction CognitoAuth (données) {_classCallCheck (this, CognitoAuth) .....}


également consoler auth renvoie un objet avec toutes les données spécifiées: - this.auth: - {"clientId": "***********", "appWebDomain": "‌ https: // ** ******** so‌ uth-1.amazoncognito.‌ com ", ....


3 Réponses :


0
votes

Essayez ceci

​​installez les types pour pouvoir avoir intellisense sur amazon-sdk

npm i @ types / amazon-cognito-auth-js --save-dev

puis changez votre méthode de connexion pour ceci

login() {
   const auth = new CognitoAuth(this.authData);
   console.log("hello");
   auth.userhandler.onSuccess = (result) => {
        alert("Sign in success");       
   };
   auth.userhandler.onFailure = (err) => {
        alert("Error!");
   };
}


0 commentaires

0
votes

Vous pouvez essayer de cette manière ... le code de travail pour moi.

app.component.ts

<button (click)="login()">Login</button>

app.component.html

import { Component, OnInit } from '@angular/core';
import { CognitoAuth } from 'amazon-cognito-auth-js';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  auth: any;
  constructor() {
    //
  }

  ngOnInit() {
    this.auth = this.initCognitoSDK();
    const curUrl = window.location.href;
    this.auth.parseCognitoWebResponse(curUrl);
  }

  initCognitoSDK() {
    const authData = {
      ClientId: 'xyz',
      AppWebDomain: 'xyz', 
      TokenScopesArray: ['openid'],
      RedirectUriSignIn: 'xyz',
      UserPoolId: 'xyz',
      RedirectUriSignOut: 'xyz',
      IdentityProvider: 'xyz',
      AdvancedSecurityDataCollectionFlag: false
    };

    const auth = new CognitoAuth(authData);

    auth.userhandler = {
      onSuccess: (result) => {
        alert('Sign in success');
        this.showSignedIn(result);
      },
      onFailure: (err) => {
        alert('Sign in failed');
      }
    };
    auth.useCodeGrantFlow();
    return auth;
  }

  login() {
    this.auth.getSession();
  }

  showSignedIn(session) {
    console.log('Session: ', session);
  }
}


0 commentaires

3
votes

Vérifiez vos valeurs authData AppWebDomain , TokenScopesArray et IdentityProvider (consultez mes commentaires ci-dessous):

> npm install browser-sync --save-dev
> ng serve --ssl true --ssl-key /node_modules/browser-sync/lib/server/certs/server.key --ssl-cert /node_modules/browser-sync/lib/server/certs/server.crt

Consultez GitHub pour plus d'informations. À partir de la documentation du point de terminaison AUTHORIZATION , notez que identity_provider peut être:

  • Pour la connexion sociale, les valeurs valides sont Facebook, Google et LoginWithAmazon.
  • Pour les groupes d'utilisateurs Amazon Cognito, la valeur est COGNITO.
  • Pour les autres fournisseurs d'identité, ce serait le nom que vous avez attribué l'IdP dans votre pool d'utilisateurs.

Solution

La solution mentionnée ci-dessous est pour Google Sign-In dans Angular 7.

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login/login.component';
import { HomeComponent } from './home/home.component';

const routes: Routes = [
  { path:'', component: LoginComponent },
  { path:'home', component: HomeComponent }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

In auth-app / src / app / cognito.service.ts

<button (click)="printToken()">Print Token</button>

<button (click)="signOut()">Signout</button>

Dans auth-app / src / app / app.component. html

import { Component, OnInit } from '@angular/core';
import { CognitoService } from '../cognito.service';
import { Router } from '@angular/router';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.scss']
})
export class HomeComponent implements OnInit {

  constructor(private cognitoService : CognitoService, private router : Router) {
    if(this.router.url.indexOf('?') !== -1) {
      this.router.navigateByUrl(this.router.url.substring(0, this.router.url.indexOf('?')));
    } else {
      this.cognitoService.login();
    }
  }

  ngOnInit() { }

  printToken() {
    alert(this.cognitoService.accessToken);
  }

  signOut() {
    this.cognitoService.signOut();
  }
}

Dans auth-app/src/app/login/login.component.ts

<h1>Login</h1>

<button (click)="loginWithGoogle()">Login with Google</button>

Dans auth-app/src/app/login/login.component.html^

import { Component, OnInit } from '@angular/core';
import { CognitoService } from '../cognito.service';
import { Router } from '@angular/router'

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {

  constructor(private cognitoService : CognitoService, private router : Router) {
    if(!this.cognitoService.isAuthenticated) {
      console.log("Not authenticated")
    } else {
      console.log("Already authenticated")
      this.router.navigateByUrl(this.router.url + "/home");
    }
   }

  ngOnInit() { }

  loginWithGoogle() {
    this.cognitoService.login();
  }
}

Dans auth-app / src / app / home / home.component.ts

<router-outlet></router-outlet>

Dans auth-app / src / app / home / home. component.html

import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { CognitoAuth } from 'amazon-cognito-auth-js';

@Injectable(
  {
  providedIn: 'root'
  }
)
export class CognitoService {

  authData: any;
  auth: any;
  session: any;

  constructor(private router : Router) {
    this.getAuthInstance();
  }

  getAuthInstance() {
    this.authData = {
      ClientId: '...',
      AppWebDomain: '...', 
      TokenScopesArray: ['openid', 'email', 'profile'],
      RedirectUriSignIn: 'https://localhost:4200/home',
      UserPoolId: '...',
      RedirectUriSignOut: 'https://localhost:4200',
      AdvancedSecurityDataCollectionFlag: false
    }

    this.auth = new CognitoAuth(this.authData);

    this.auth.userhandler = {
      onSuccess: session => {
        console.log('Signin success');
        this.signedIn(session);
      },
      onFailure: error => {
        console.log('Error: ' + error);
        this.onFailureMethod();
      }
    }

    //alert(this.router.url);
    //this.auth.useCodeGrantFlow();
    this.auth.parseCognitoWebResponse(this.router.url);
  }

  signedIn(session) {
    this.session = session;
  }

  onFailureMethod() {
    this.session = undefined;
  }

  get accessToken() {
    return this.session && this.session.getAccessToken().getJwtToken();
  }

  get isAuthenticated() {
    return this.auth.isUserSignedIn();
  }

  login() {
    this.auth.getSession();
    this.auth.parseCognitoWebResponse(this.router.url);
  }

  signOut() {
    this.auth.signOut();
  }
}

Dans auth-app/src/app/app-routing.module.ts

XXX

Pour exécuter l'application avec HTTPS (car l'URL de rappel doit être HTTPS pour Cognito):

> npm install -g @angular/cli
> ng new auth-app
Angular Routing: Yes
> cd auth-app
> ng g c login
> ng g c home
> ng g s cognito
> npm install --save amazon-cognito-auth-js

Veuillez notez que vous devez configurer l'URL de rappel et de déconnexion suivante dans Cognito. Accédez à la console Cognito -> Votre groupe d'utilisateurs -> Intégration d'application -> Paramètres du client d'application

Accédez à https: // localhost: 4200

Références:


0 commentaires