OAuth2.0 在分布式微服务下的统一认证授权

微服务的认证方案

统一在网关层面(SpringCloud Gateway)认证鉴权,微服务只负责自身业务,代码耦合性低,方便后续的扩展。把认证服务器独立出来,和网关解耦。
在这里插入图片描述
涉及角色
客户端:需要访问微服务资源。
网关:负责转发、认证、鉴权。
OAuth2.0 授权服务:负责认证授权颁发令牌。
微服务集合:提供资源的一系列服务。

流程

  • 客户端发出请求给网关获取令牌。
  • 网关收到请求,直接转发给授权服务。
  • 授权服务验证用户名、密码等一系列身份,通过则颁发令牌给客户端。
  • 客户端携带令牌请求资源,请求直接到了网关层。
  • 网关对令牌进行校验(验签、过期时间校验…)、鉴权(对当前令牌携带的权限)和访问资源所需的权限进行比对,如果权限有交集则通过校验,直接转发给微服务。微服务进行逻辑处理。
@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("my_service", r -> r.path("/my-service/**")
                .filters(f -> f.filter((exchange, chain) -> {
                    // 检查令牌是否存在
                    String token = exchange.getRequest().getHeaders().getFirst("Authorization");
                    if (token == null || !token.startsWith("Bearer ")) {
                        return Mono.error(new RuntimeException("Unauthorized")); // 或返回401状态
                    }
                    return chain.filter(exchange);
                }))
                .uri("http://localhost:8081")) // 转发请求到后端服务
            .build();
    }
}

保证 JWT 不被泄露和滥用

JWT(JSON Web Token)本身并不能完全保证不被泄露和滥用,但可以通过一些最佳实践来增强其安全性:

  • 使用 HTTPS 确保所有传输 JWT 的请求都通过 HTTPS 进行,以防止中间人攻击(MITM)和窃听。
  • 有效期设置设置合理的有效期,access token 应该短期有效(如几分钟),而 refresh token 可以稍长。这样可以降低被滥用的风险。
  • 令牌签名使用强加密算法(如 RS256)对 JWT 进行签名,以确保其完整性和真实性,防止篡改。
  • 权限控制通过 scopes 限制 JWT 的权限,确保 token 只能访问必要的资源。
  • 黑名单机制实现令牌撤销机制,允许在用户注销或怀疑令牌被盗用时,将其加入黑名单。

授权第三方 QQ 和微信的登录

在 Spring Cloud 分布式微服务系统中,结合 OAuth2.0 认证中心和 Spring Cloud Gateway 作为鉴权中心来授权第三方 QQ 和微信登录,通常可以按照以下步骤进行:

  • 用户在客户端应用中选择使用 QQ 或微信登录,客户端向 Spring Cloud Gateway 发送请求。
  • Gateway 将请求转发到 OAuth2.0 认证中心,认证中心生成一个重定向 URL,包含客户端 ID、重定向 URI 等信息,返回给客户端。
  • 客户端将用户重定向到 QQ 或微信的登录页面,用户完成登录并授权。
  • 第三方平台将用户重定向回 OAuth2.0 认证中心,携带授权码和状态参数。
  • OAuth2.0 认证中心使用授权码向 QQ 或微信的 Token Endpoint 请求访问令牌,验证成功后获取用户信息。
  • 认证中心检查用户是否已存在于系统中,若不存在则创建新用户,若存在则更新用户信息(用户名和头像等)。
  • 认证中心生成自己的JWT或其他类型的访问令牌,返回给 Spring Cloud Gateway。
  • Gateway 接收到内部令牌后,将其返回给客户端应用,用户即可使用该令牌访问系统的其他微服务。
  • 当用户访问系统其他 API 时,Gateway 会验证该令牌的有效性,并进行相应的权限控制。

通过这种方式,OAuth2.0 认证中心和 Spring Cloud Gateway 有效协同,实现了对第三方 QQ 和微信登录的授权管理。

客户端问题

如果在 Spring Cloud 搭建的系统中没有其他系统授权的登录业务,那么认证中心主要负责内部用户的身份验证和权限管理。在这种情况下,客户端的问题就不需要特别考虑,因为所有用户都会直接通过系统进行身份验证,不涉及第三方认证或授权。因此,认证中心可以专注于处理用户的注册、登录、权限控制等内部功能。

授权第三方登录 QQ、微信用户数据表设计

  • 用户 ID:主键,自增或 UUID,唯一标识用户。
  • 用户名:用户在系统中的昵称或用户名。
  • 邮箱:用户的邮箱地址,可能用于联系或找回密码。
  • 手机号:用户的手机号码,选填。
  • 头像 URL:用户在 QQ 或微信上的头像链接。
  • 第三方 ID:QQ 或微信的用户唯一标识,用于关联第三方账户。
  • 第三方类型:标识用户使用的第三方平台(如“QQ”、“微信”)。
  • 密码:用于传统登录的密码,若支持。
  • 创建时间:记录用户注册的时间。
  • 更新时间:记录用户信息最后修改的时间。
  • 状态:用户状态(如“激活”、“禁用”)。

这种设计可以灵活支持第三方登录,同时也保留了传统登录方式的兼容性。

第三方登录是得不到手机号码和邮箱的,此时的通知是通过调用第三方接口对用户进行消息通知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值