【问题标题】:Router Guards canActivate not working with API in angularRouter Guards canActivate不能在角度使用API
【发布时间】:2019-03-30 10:28:25
【问题描述】:

此身份验证防护不适用于 API 响应。当我运行代码时,它总是返回 true。但我想根据 api 响应运行警卫。是他们实现这一目标的方法吗?

import {Injectable} from '@angular/core';
import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, Route} from '@angular/router';
import {
    HttpClient,
    HttpHeaders
} from '@angular/common/http';
import {Observable} from 'rxjs';

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(private router: Router, private http: HttpClient) {
    }

    canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

        const sendData = {};
        sendData['id'] = sessionStorage.getItem('id');
        console.log(JSON.stringify(sendData));
        const headers = new HttpHeaders()
            .set('Content-Type', 'application/json')
            .set('token', sessionStorage.getItem('auth') ? sessionStorage.getItem('auth') : 'test');
        this.http.post('http://127.0.0.1:5000/auth',
            JSON.stringify(sendData), {
                headers
            })
            .subscribe(
                (val: any) => {
                },
                response => {

                    this.router.navigate(['/login']);
                },
                () => {
                    console.log('The POST observable is now completed.');
                });

        return true;

    }

}

【问题讨论】:

    标签: javascript angular api canactivate


    【解决方案1】:

    检查这个。您在 canActivate authguard 结束时返回了 true。这样,它将始终返回 true。相反,您应该根据您的情况在 http post 请求的 subscribe 方法中使用它。像这样的..

    this.http.post('http://127.0.0.1:5000/auth',
    JSON.stringify(sendData), {
        headers
    }).pipe(map(response => {
        //suppose we get isAuthenticated bit in response. Your response obj may vary but logic shall be same
        if (response.isAuthenticated) {
            return true;
        }
        else {
            return false;
        }
    }));
    

    谢谢。

    【讨论】:

    • 好先生,我如何延迟可以激活返回。因为 API 调用需要一些时间来响应。
    • 由于 canActivate 可以返回 Observable 或 Promise 你不需要担心延迟。如果你愿意,你可以钩住http post的订阅方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2018-01-18
    • 2019-09-10
    • 2018-11-15
    • 2019-02-05
    • 2016-10-15
    • 1970-01-01
    相关资源
    最近更新 更多