面试题答案
一键面试问题分析
- 认证跨域
- 不同域下,用户认证信息传递困难。例如,前端在域A发起请求到微服务A完成认证,当向域B的微服务B发起请求时,微服务B无法直接获取域A的认证信息。
- 跨域认证可能涉及不同认证机制的交互,如域A使用OAuth 2.0,域B使用基于JWT的认证,增加了兼容性问题。
- 授权跨域
- 权限信息在不同域的微服务间同步困难。若微服务A根据用户角色赋予某些权限,当请求跨域到微服务B时,微服务B可能无法及时获取最新的权限信息,导致授权判断失误。
- 不同域的微服务可能有不同的授权策略,如域A基于角色的访问控制(RBAC),域B基于属性的访问控制(ABAC),这使得统一授权管理变得复杂。
解决方案
- 技术选型
- JWT(JSON Web Token):JWT可以携带用户认证和部分授权信息,在跨域请求时,前端将JWT包含在请求头中,各微服务通过验证JWT的签名来确认请求合法性。它具有自包含性,微服务无需再向其他服务请求认证信息。
- OAuth 2.0:适用于不同域下微服务间的授权。它可以通过授权服务器来管理不同微服务的授权,允许第三方应用获得对资源服务器资源的有限访问权限。
- 集中式身份验证服务(如Keycloak):Keycloak是一个开源的身份和访问管理解决方案。它提供了单点登录、用户管理、客户端管理等功能,各微服务可以集成Keycloak客户端,由Keycloak统一处理认证和授权,实现跨域的认证与授权管理。
- 实现思路
- 基于JWT的实现:
- 用户在登录时,认证服务生成JWT,包含用户标识、角色等信息,并对其签名。
- 前端将JWT存储在本地(如localStorage或cookie),每次跨域请求时,将JWT放在请求头(如Authorization: Bearer )中。
- 微服务接收到请求后,使用相同的密钥验证JWT签名,若验证通过,则获取其中的用户信息进行授权判断。
- 基于OAuth 2.0的实现:
- 客户端(前端应用)向授权服务器请求授权码。
- 授权服务器验证客户端身份和用户授权后,颁发授权码。
- 客户端使用授权码向授权服务器换取访问令牌(access token)。
- 客户端在跨域请求时,将访问令牌包含在请求中,资源服务器(微服务)通过与授权服务器交互验证访问令牌的有效性,进行授权操作。
- 基于Keycloak的实现:
- 各微服务集成Keycloak客户端,配置相关连接信息。
- 用户登录到Keycloak统一认证页面,Keycloak完成认证后,生成相关认证和授权信息。
- 微服务通过Keycloak客户端获取认证和授权信息,进行请求处理。
- 基于JWT的实现:
- 可能面临的挑战
- 性能问题:验证JWT签名、与授权服务器交互验证令牌等操作会增加微服务的处理开销,特别是在高并发情况下,可能影响系统性能。可以通过缓存认证和授权信息、优化验证算法等方式缓解。
- 安全性问题:JWT若泄露,可能导致信息泄露和非法访问。需要确保JWT的传输安全(如使用HTTPS),设置合理的过期时间。对于OAuth 2.0和Keycloak,要防止授权服务器被攻击,保证其安全性。
- 兼容性问题:不同微服务可能使用不同的技术框架,在集成认证和授权方案时,可能遇到兼容性问题。例如,某些老旧框架对新的认证和授权标准支持不完善,需要进行额外的适配工作。