以角度检查登录和保护路由的正确方法api odoo

问题描述

我正在开发一个应用程序来为odoo部署的数据库创建一系列管理视图,这些信息很丰富,但稍后了解登录和检查过程会很有趣。

odoo 代码公开了一个端点来登录,如果过程正确,它不会返回令牌或类似的东西,而是返回一个带有会话 ID、服务器 cookie(httponly)的 cookie,因此我无法从角度应用。

登录请求,返回响应,包含用户信息和会话(如果正确)。

另一方面,odoo 也暴露了一个端点来检查当前的浏览器会话,从而能够知道我们是否已登录

我已经完全解决登录过程,我只需要向用户发送 POST 请求并登录并检查响应是否不包含错误,这是我的 authetication.service.ts

import { Injectable } from '@angular/core';
import { HttpClient,HttpHeaders } from '@angular/common/http';

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

  constructor(private http:HttpClient) { 
    console.log("Servicio authentication listo")
  }

  login(user:string,pass:string){
    let body = {
        "jsonrpc": "2.0","params": {
            "db": "database","login": user,"password": pass
        }
      }
      console.log(body);
      return this.http.post('/odoo/web/session/authenticate',body)
  }

  checkSession(){
    return this.http.post('/odoo/web/session/get_session_info',{});
  }

  destroySession(){
    console.log('here');
    return this.http.post('/odoo/web/session/destroy',{})
  }

}

返回一个 observable,我必须通过订阅读取它,并根据它是否带来错误来了解身份验证是否正确。

这是我的auth.guard .ts

import { ComponentFactoryResolver,Injectable } from '@angular/core';
import { CanActivate,CanActivateChild,CanDeactivate,CanLoad,Route,UrlSegment,ActivatedRouteSnapshot,RouterStateSnapshot,UrlTree,Router } from '@angular/router';
import { Observable,Subject } from 'rxjs';
import { take,finalize,map } from 'rxjs/operators';
import { AuthenticationService } from '../services/authentication.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate,CanDeactivate<unkNown>,CanLoad {

  constructor(
    private authentication:AuthenticationService,private router: Router
    ) {
    }

  canActivate(
    route: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean> | boolean {
      return new Observable<boolean>(obs => {
        this.authentication.checkSession().subscribe((data:any) => {
          if (data.hasOwnProperty('error')!=true) {
            obs.next(true);
            obs.complete();
          }
          else{
            this.router.navigateByUrl('/login');
            obs.complete();
          }
        });
      });
  }
}

显然它按我的意愿工作,但我不太了解它是如何工作的,我想,它似乎也有点脏,我想知道是否有人对重构有任何建议。例如,在身份验证服务或类似服务中获取布尔变量的方法

非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)