1

我正在使用 Angular 11 和版本 10 的 augular-oauth-oidc

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

@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 路由守卫和拦截器能完成这项工作吗?

谢谢!

4

1 回答 1

1

检查用户当前是否登录?

取决于您是否正在寻找:

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

对于 (B)身份验证,查看身份声明非常好。对于 (A)授权,您通常会这样做:

const isAuthorized = this.oauthService.hasValidAccessToken();

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

这如何防止用户仅在其控制台中修改此变量

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

Angular 路由守卫和拦截器能完成这项工作吗?

默认情况下,Angular 路由对 OAuth2/OIDC 一无所知。你可以看看我的示例路由守卫,它会检查身份验证,它间接地只是检查hasValidAccessToken().

拦截器本身也不了解 OAuth2/OIDC,但如果resourceServer在库中配置OAuthModuleConfig默认​​拦截器,则会从库中注册一个默认拦截器,该拦截器会将访问令牌发送到对特定 API 集的所有请求。

于 2021-05-30T11:33:56.117 回答