问题描述
我将 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 的请求。