通用鉴权框架

本文介绍了在线教室的鉴权框架设计,目标是提供灵活性、低侵入性和性能优化。通过Token实现无状态鉴权,减少服务端存储负担,支持跨域共享。客户端流程包括Token的获取、刷新和失效处理,服务端则负责认证和错误响应。设计中还涉及到了JWT的使用,确保安全的身份验证。
摘要由CSDN通过智能技术生成

框架设计目标

  • 提供更高的灵活性,满足不同业务场景的鉴权需求
  • 对现有代码侵入性低,教室客户端各业务模块无需感知鉴权逻辑的存在(拦截器)
  • 尽可能降低因为鉴权逻辑导致教室指标的劣化(缓存 + 提前获取)

Cookie、Token 的区别

Cookie 主要指 Session ID 存储到 Cookie 中进行的验证的方式,该方式存在一些弊端:

  • 服务端需要存储 Session 信息,扩展性差
  • 跨域资源共享成本高,容易出现权限问题
  • 教室后台无法获取宿主的 Session 信息

Token 是无状态的,服务端不需要保存用户信息,方便服务端扩展,可以跨域共享

客户端流程

  • 宿主端:通过账户名、密码登陆
    • 实现 Token 获取接口(需要特殊处理无网、SDK未初始化的情况)
    • 登出后主动调用教室的 Token 失效接口
    • 登入后主动调用教室的 Token 刷新接口
  • 进教室前需要判断本地缓存的 Token 是否有效
    • 如果存在有效 Token,则直接调用进教室接口
    • 如果不存在有效 Token,则应该先调用 Token 刷新接口,设置超时时间并监听 Token 更新成功后调用进教室接口
  • Token 自身携带到期时间,内部通过读取 Token 过期时间来维护自动刷新逻辑
  • 通过 Interceptor 处理网络请求
    • 拦截器内部自动添加 Header 信息
    • 拦截器内部判断 body 中存在 ERR_NO 字段,且具体错误类型为 TOKEN_INVALID,则主动触发  Token 刷新
  • 每次强制刷新 Token 都会新启动一个 Task 并结束之前的 Task,在 Task 内部会维护自身状态,并通过 retryWhen 来控制失败重试逻辑
enum class State {
    /**
     * task初始化状态
     */
    INITIALIZED,
    /**
     * task调度前准备阶段
     */
    PREPARING,
    /**
     * task重试期间等待状态
     */
    WAITING,
    /**
     * task执行状态
     */
    LOADING,
    /**
     * task结束状态
     */
    CLOSED
}

主要接口设计

interface AuthorizationManager {

    /**
     * 刷新 Token
     * @param force 是否强制刷新, 如果内部正在刷新,则忽略
     */
    fun updateToken(force: Boolean)

    /**
     * 使 Token 失效
     */
    fun invalidToken()

    /**
     * 获取 Token 信息
     */
    fun token(): Token?

    /**
     * 获取 Token 信息
     */
    fun getTokenObservable(): Observable<Token>
}

class AuthorizationConfig {

    /**
     * 获取 Token 接口,由宿主实现
     */
    val tokenProvider: TokenProvider
}

interface TokenRefreshScheduler {

    /**
     * 定时刷新
     */
    fun scheduleRefresh(delay: Long)

    /**
     * 立即刷新
     */
    fun refreshNow()

    /**
     * 尝试刷新,如果当前有刷新任务正在执行,则忽略
     */
    fun tryRefresh()

    fun networkStatusChange(status: Boolean)

    fun addTokenRefreshListener(listener: TokenRefreshListener)

    fun removeTokenRefreshListener(listener: TokenRefreshListener)

    fun reset()

    interface TokenRefreshListener {

        fun onNewToken(token: Token)
    }
}

服务端流程

  1. 所有接入在线教室的机构均需要在开发者中心注册,注册通过后会分配唯一的 AppID 和应用 AppSecret,作为机构身份标识以及后续认证使用
  2. 当机构注册完成,并且完成了相关的接入工作后,当机构用户需要访问在线教室相关服务和资源时,统一需要经过在线教室的认证服务认证后才可访问,一旦认证失败或者Token过期,在线教室会返回相关错误码
  3. 机构客户端需要能响应该错误码并且重新向机构自己服务端签发新的Token
  4. 机构客户端携带新的Token再次访问教室服务和资源,在线教室认证服务验证通过,放行用户或者返回相关资源,完成请求

JSON Web Token

JWT 由三部分组成,每个部分通过 . 分隔:header.payload.verify_signature

在线教室 Payload 信息

{
  "aid": 1234,                    // 应用 ID
  "user_id": 2137382639302388928, // 用户信息
  "role_key": "group_teacher",    // 角色信息
  "issued_at": 1836717482,        // 签发时间
  "expires_at": 1852941882        // 过期时间
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little-sparrow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>