Angular Oauth2 OIDC - 如何检查用户是否登录?

问题描述

我将 Angular 11 与 augular-oauth-oidc 的 10 版一起使用

这是检查用户当前是否登录的正确方法吗?

@Injectable({
  providedIn: 'root'
})
export class AuthService {
  constructor(
    private oauthService: OAuthService,private router: Router,) {

 .
 .
 .

  isLoggedIn(): boolean {
    const identityClaim = this.oauthService.getIdentityClaims();
    return identityClaim && identityClaim['name'] ? true : false;
  }

我觉得这很hacky...我只是在检查身​​份中是否存在名称字段?

这如何防止用户仅在其控制台中修改此变量 - 除了在 api 提交时进行服务器端检查或其他内容

Angular 路由守卫和拦截器能做这个工作吗?

谢谢!

解决方法

检查用户当前是否登录?

取决于您是否正在寻找:

  • (A) 用户是否获得授权进行 API 调用?
  • (B) 用户是否经过身份验证,我们对他们的身份了解多少?

对于 (B) 身份验证,查看身份声明完全没问题。对于 (A) 授权,您通常这样做:

const isAuthorized = this.oauthService.hasValidAccessToken();

这是因为身份声明在 SPA 内有用,而访问令牌通常是发送到 API 的不记名令牌,API 再次对令牌进行自己的验证和检查.

这如何防止用户在他的控制台中修改这个变量

这是浏览器应用程序固有的。您无法阻止用户(或坏浏览器)篡改在浏览器中运行的代码。这确实是当您发送访问令牌时服务器必须自行检查的原因。

Angular 路由守卫和拦截器能做这个工作吗?

默认情况下,Angular 路由对 OAuth2/OIDC 一无所知。您可以查看一下 my sample route guard,它确实检查了身份验证,它只是间接地检查 hasValidAccessToken()

拦截器本身也不知道 OAuth2/OIDC,但是如果库的 OAuthModuleConfig 中的 you configure resourceServer 从库中注册了一个默认的拦截器,它会将访问令牌发送给所有对一组特定 API 的请求。