我使用Angular 11和Auguslar 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;
}
我觉得这太离谱了。。。我只是在检查身份中是否存在名称字段?
这是如何防止用户在控制台中修改这个变量的——除了在提交api或其他什么时进行服务器端检查之外。
Angular路由保护和拦截器能完成这项工作吗?
谢谢!
检查用户当前是否登录?
取决于您是否在寻找其中之一:
- (A(用户是否授权进行API调用
- (B( 用户是否经过验证?我们对他们的身份了解多少
对于(B(身份验证,查看身份声明是完全可以的。对于(A(授权,您通常会这样做:
const isAuthorized = this.oauthService.hasValidAccessToken();
这是因为身份声明在SPA中仅有用,而访问令牌通常是发送到API的承载令牌,后者再次对令牌进行自己的验证和检查。
这如何防止用户在其控制台中修改此变量
这是浏览器应用程序固有的。您无法阻止用户(或坏浏览器(篡改在浏览器中运行的代码。这就是为什么当您发送访问令牌时,服务器必须自己进行检查的原因。
Angular路由保护和拦截器能完成这项工作吗?
默认情况下,角度路由对OAuth2/OIDC一无所知。您可以看到我的示例路由保护,它确实检查身份验证,它只是间接地检查hasValidAccessToken()
。
拦截器本身也不知道OAuth2/OIDC,但如果在库的OAuthModuleConfig
中配置resourceServer
,则会从库中注册一个默认的拦截器,该拦截器会将访问令牌与所有请求一起发送到一组特定的API。