建议如何设置复杂的登录

时间:2016-10-25 15:18:53

标签: angular firebase firebase-authentication rxjs

我有"复杂"登录结构,我很乐意使用RxJs来处理序列,并为我的应用程序的其余部分提供登录状态...

这是它的工作原理:

  1. 从后端获取JWT令牌
  2. 使用令牌
  3. 登录Firebase
  4. 将JWT令牌从后端(包含角色等)传播给订阅者
  5. 重定向到信息中心
  6. 我想知道我是否应该在登录失败时使用错误信号并在完成时完成信号,但我不知道这是否是个好主意,因为我想继续发送信号用户注销,然后再次登录等。

    有关解决此问题的好方法的建议/提示吗? (现在我使用此复制/粘贴代码(丑陋):

    @Injectable()
    export class AuthService {
        public loginStatus$ = new EventEmitter<LoginStatus>();
    
        constructor(
            private http:Http,
            private jwtHelper: JwtHelper,
            private af: AngularFire,
            private auth: AngularFireAuth,
        ) {}
    
        login(username:string, password:string) {
            let headers = new Headers();
            let body = JSON.stringify({username, password});
            headers.append('Content-Type', 'application/json');
            this.http.post(environment.baseUri + "auth/fetch_token", body, {headers})
                .subscribe(
                    response => {
                        const authToken = response.json().auth_token;
                        const authTokenDecoded = this.jwtHelper.decodeToken(authToken);
                        console.log(authTokenDecoded);
                        localStorage.setItem("auth_token", authToken);
                        this.auth.login(authToken, {
                            provider: AuthProviders.Custom,
                            method: AuthMethods.CustomToken
                        });
                        this.loginStatus$.emit(new LoginStatus(true,"Login successful"));
                    },
                    error => {
                        console.log(error);
                        this.loginStatus$.error(new LoginStatus(false,"Unknown username or password."));
                    }
                );
        }
    }
    
    export class LoginStatus {
        constructor(public status: boolean, public message: string) {}
    }
    

    另外,我想从login()返回一个Observable(感觉正确

1 个答案:

答案 0 :(得分:0)

只需HTTP请求响应401(授权)或成功(200)。

如果401然后router.naviagte到登录页面。

如果没有,则允许用户前往他们想要的地方。

在导航到其他页面时,您将启动/授权请求以检查用户是否仍然有权使用。

唯一不需要授权的后端端点是登录端点本身。如果user / pass是正确的,那么为所有将来的请求设置JWT cookie(1天后过期?)。

客户端实现可以轻松使用Observables(如果您想使用RxJs服务器端,也可以使用后端实现)。