gpt4 book ai didi

angular - 如何使用 Angular 2 useHash : true? 设置 Auth0

转载 作者:行者123 更新时间:2023-12-02 16:09:55 27 4
gpt4 key购买 nike

有关使用散列路由(例如 http://somdomain.com/#/someroute )将 auth0 与 Angular 2 一起使用的文档和示例非常稀疏且过时。

有多个问题需要解决:

  1. auth0 库监听 URL 片段中的更改。不幸的是,Angular 吞噬了 URL 片段的更改,因为它认为自己正在处理路由。

  2. url 片段以 #access_token=... 开头,并且 Angular 会抛出错误,因为 access_token 未注册为路由。

  3. 即使您注册了路线access_token,您也不希望以任何方式将其显示为路线,因此您需要取消导航。

要实际设置它,需要做哪些事情?

最佳答案

首先您需要auth0-lock

 npm install --save auth0-lock

接下来,您需要身份验证服务。以下身份验证服务实现 login()logout()

在调用这些方法之前,请确保使用 registerAuthenticationWithHashHandler 配置服务。这可以在 App.Component.ts

中完成
// AuthService.ts
import { environment } from './../environments/environment';
import { Injectable } from '@angular/core';
import { Router, RouterEvent } from '@angular/router';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/take';
import { AuthCallbackComponent } from './../app/auth-callback/auth-callback.component';
import { AuthenticationCallbackActivateGuard } from '../app/auth-callback/auth-callback-activate-guard';
import Auth0Lock from 'auth0-lock';

@Injectable()
export class AuthService {

private lock: Auth0Lock;

constructor(public router: Router) {

this.lock = new Auth0Lock(
environment.auth0.clientID,
environment.auth0.domain,
{
oidcConformant: true,
autoclose: true,
auth: {
autoParseHash: false,
redirectUrl: environment.auth0.redirectUri,
responseType: 'token id_token',
audience: environment.auth0.audience,
params: {
scope: 'openid'
}
}
}
);

}

public login(): void {
this.lock.show();
}

// Call this method in app.component.ts
// if using path-based routing
public registerAuthenticationHandler(): void {
this.lock.on('authenticated', (authResult) => {
if (authResult && authResult.accessToken && authResult.idToken) {
this.setSession(authResult);
this.router.navigate(['/']);
}
});
this.lock.on('authorization_error', (err) => {
this.router.navigate(['/']);
console.log(err);
alert(`Error: ${err.error}. Check the console for further details.`);
});
}

// Call this method in app.component.ts
// if using hash-based routing
public registerAuthenticationWithHashHandler(): void {

this.registerAuthenticationHandler();
this.workaroundHashAccessTokenRoute();

this.router.events.take(1).subscribe(event => {

if (!(event instanceof RouterEvent)) {
return;
}

this.lock.resumeAuth(window.location.hash, (err, authResult) => {
if (authResult && authResult.idToken) {
this.lock.emit('authenticated', authResult);
}

if (authResult && authResult.error) {
this.lock.emit('authorization_error', authResult);
}
});

});
}

private workaroundHashAccessTokenRoute() {

/* workaround useHash:true with angular2 router
** Angular mistakenly thinks "#access_token" is a route
** and we oblige by creating a fake route that can never be activated
*/
const routes = this.router.config;
routes.splice(0, 0, {
path: 'access_token',
component: AuthCallbackComponent,
canActivate: [AuthenticationCallbackActivateGuard]
});
this.router.resetConfig(routes);
}

private setSession(authResult): void {
// Set the time that the access token will expire at
const expiresAt = JSON.stringify((authResult.expiresIn * 1000) + new Date().getTime());
localStorage.setItem('access_token', authResult.accessToken);
localStorage.setItem('id_token', authResult.idToken);
localStorage.setItem('expires_at', expiresAt);
}

public logout(): void {
// Remove tokens and expiry time from localStorage
localStorage.removeItem('access_token');
localStorage.removeItem('id_token');
localStorage.removeItem('expires_at');
// Go back to the home route
this.router.navigate(['/']);
}

public isAuthenticated(): boolean {
// Check whether the current time is past the
// access token's expiry time
const expiresAt = JSON.parse(localStorage.getItem('expires_at'));
return new Date().getTime() < expiresAt;
}
}

registerAuthenticationWithHashHandler 创建一个名为“access_token”的虚拟路由,它受到名为 AuthenticationCallbackActivateGuard 的规则的保护,该规则始终返回 false。

// auth-callback-activate-guard.ts
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { Location } from '@angular/common';
import { Router } from '@angular/router';

@Injectable()
export class AuthenticationCallbackActivateGuard implements CanActivate {

constructor(private router: Router, private location: Location) { }

canActivate() {
return false;
}
}

以下是虚拟路线所需的部件:

// auth-callback/auth-callback.components.ts
import { Component, OnInit } from '@angular/core';

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

constructor() { }

ngOnInit() {
}

}

在App.Component.ts中注册身份验证服务

// app/app.component.ts
import { Component } from '@angular/core';
import { AuthService } from '../services/auth.service';

@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';

constructor(private auth: AuthService) {
auth.registerAuthenticationWithHashHandler();
}
}

关于angular - 如何使用 Angular 2 useHash : true? 设置 Auth0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47764509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com