You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Authorization Server中设置授权同意的有效期?

实现带有效期的授权同意功能

核心逻辑

用户完成授权后,生成带有效期的授权凭证并存储,后续访问时校验凭证是否在有效期内,有效则跳过授权流程,过期则重新引导授权。

具体实现方案

1. 生成并存储授权凭证

  • 服务端场景(推荐,安全性高):
    用户提交授权同意后,服务端生成唯一授权标识(比如UUID),同时记录授权时间和有效期(如30天),将这些信息关联用户ID存入数据库。
  • 纯前端场景(仅适用于单设备、低安全需求场景):
    把授权信息(包含授权时间、有效期)加密后存在localStorage里,避免被直接篡改。

2. 校验授权有效性

  • 服务端校验:
    用户进入需授权的页面/发起请求时,通过用户ID查询最新的授权记录,计算当前时间与授权时间的差值,若小于有效期则判定授权有效,直接跳过授权流程。
  • 前端校验:
    从localStorage取出加密的授权信息,解密后对比当前时间和过期时间,若未过期则跳过授权。

3. 过期处理

当授权凭证过期后,自动跳转至授权同意页面,用户重新完成授权后,更新数据库或本地存储中的授权信息。

示例代码片段(Node.js + MySQL 服务端)

// 生成用户授权记录
const uuid = require('uuid');
async function createUserAuth(userId) {
  const authId = uuid.v4();
  // 设置30天有效期
  const expireAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000);
  await db.query(
    'INSERT INTO user_auth_records (user_id, auth_id, expire_at) VALUES (?, ?, ?)',
    [userId, authId, expireAt]
  );
  return authId;
}

// 校验用户授权是否有效
async function isAuthValid(userId) {
  const [records] = await db.query(
    'SELECT expire_at FROM user_auth_records WHERE user_id = ? ORDER BY create_time DESC LIMIT 1',
    [userId]
  );
  if (!records.length) return false;
  const expireTime = new Date(records[0].expire_at).getTime();
  return Date.now() < expireTime;
}

注意事项

  • 优先选择服务端存储授权信息,避免前端篡改导致的权限漏洞。
  • 若需支持多设备同步授权状态,必须依赖服务端存储。
  • 可增加手动取消授权功能,触发时直接删除对应授权记录即可。

内容的提问来源于stack exchange,提问作者hezf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:32:02