2025-前端面试总结
微前端技术选型优缺点比较
为什么要在项目中引入微前端
qiankun的实现原理,微前端环境如何隔离
qiankun的css隔离原理
js隔离原理
设计一个沙箱机制
vite 和 webpack 的区别
前端性能优化方式
单点登录方案
讲一下 Outh2.0
OAuth 2.0 是一种授权框架,用于让应用程序可以安全地访问用户资源,而无需直接处理用户的凭据(如用户名和密码)。它提供了一种机制,使第三方应用能够访问用户的资源,并在授权的范围内操作,而无需用户直接向第三方提供其凭据。
OAuth 2.0 的核心概念
**授权服务器 (Authorization Server)**:
负责验证用户身份,并颁发访问令牌 (Access Token)。授权服务器通常与身份提供者 (Identity Provider) 结合使用,如 Google、Facebook、GitHub 等。**资源服务器 (Resource Server)**:
存储用户的资源,并负责保护这些资源。它验证访问令牌并处理授权请求。**客户端 (Client)**:
请求访问资源的应用程序或服务。客户端可以是第三方应用、Web 应用、移动应用等。**资源所有者 (Resource Owner)**:
拥有资源的用户或实体。资源所有者授权客户端访问其资源。**访问令牌 (Access Token)**:
授权服务器颁发给客户端的令牌,用于访问资源服务器上的资源。访问令牌具有时效性和范围,规定了客户端可以访问哪些资源。**刷新令牌 (Refresh Token)**:
用于获取新的访问令牌。当访问令牌过期时,客户端可以使用刷新令牌向授权服务器请求新的访问令牌。
OAuth 2.0 的授权流程
授权请求:
客户端将用户重定向到授权服务器的授权端点,请求访问权限。用户登录并授权客户端访问其资源。授权码(Authorization Code):
用户授权后,授权服务器向客户端重定向,并提供一个授权码。令牌请求:
客户端使用授权码向授权服务器的令牌端点请求访问令牌。访问令牌(Access Token):
授权服务器验证授权码,并返回访问令牌(以及可能的刷新令牌)给客户端。访问资源:
客户端使用访问令牌向资源服务器请求资源。
OAuth 2.0 的授权模式
**授权码模式 (Authorization Code Grant)**:
适用于 Web 应用程序,客户端通过授权码交换访问令牌。这是最安全的模式,因为授权码在服务器端交换访问令牌,避免了直接暴露访问令牌。**隐式授权模式 (Implicit Grant)**:
适用于浏览器中的单页应用(SPA)。用户在浏览器中授权后,直接将访问令牌返回给客户端。由于安全性较低,不推荐用于长期使用。**密码凭证模式 (Resource Owner Password Credentials Grant)**:
客户端直接获取用户的用户名和密码,然后请求访问令牌。适用于客户端与资源所有者完全信任的情况(如移动应用),但不推荐在开放环境中使用。**客户端凭证模式 (Client Credentials Grant)**:
用于应用程序间的授权,不涉及用户身份。客户端使用自身的凭证向授权服务器请求访问令牌,用于访问保护的资源。**设备授权模式 (Device Authorization Grant)**:
适用于设备无法直接进行用户交互的场景(如智能电视)。用户在另一个设备上进行授权,设备最终获取访问令牌。
OAuth 2.0 的安全考虑
- 令牌泄露:需要保护访问令牌和刷新令牌的安全,避免泄露。
- 令牌过期:使用短期有效的访问令牌和长期有效的刷新令牌来减少风险。
- 安全通信:确保所有通信都通过 HTTPS 进行,以保护数据安全。
OAuth 2.0 提供了一种灵活而安全的方式来授权客户端访问资源,是现代 Web 应用和 API 的重要组成部分。
判断对象为空的方法?
要判断一个对象是否为空对象(即没有可枚举的属性),有几种常用的方法。以下是一些常见的实现方式:
1. 使用 Object.keys()
方法
Object.keys()
方法返回一个由给定对象的可枚举属性组成的数组。如果数组长度为 0,则表示对象为空。
1 | const isEmptyObject = obj => Object.keys(obj).length === 0; |
2. 使用 for...in
循环
for...in
循环遍历对象的可枚举属性。如果没有属性可以遍历,则对象为空。
1 | const isEmptyObject = obj => { |
3. 使用 JSON.stringify()
将对象转换为 JSON 字符串,并与空对象的字符串表示进行比较。
1 | const isEmptyObject = obj => JSON.stringify(obj) === '{}'; |
4. 使用 Object.entries()
方法
Object.entries()
方法返回一个对象自身可枚举属性的键值对数组。如果数组长度为 0,则表示对象为空。
1 | const isEmptyObject = obj => Object.entries(obj).length === 0; |
注意事项
- 这些方法判断的都是对象自身的可枚举属性,继承的属性不会被考虑在内。
- 如果对象的属性是不可枚举的,这些方法也会将其视为空对象。