Auth服务
这里先写我们的初步规划,最终的实现放在最后写。这实际上也是我们的开发思路。
初步规划的API
- /api/v1/auth/login
登录接口允许用户输入用户名和密码进行登录,服务器验证成功后,会返回一个JWT。JWT会存储在客户端的本地存储中
- /api/v1/auth/register
用户注册,填写用户的基本信息,在服务器的数据库上进行注册
- /api/v1/auth/verify
用户在拿着JWT去访问别的微服务的时候,我们要先验证这个JWT的合法性。确保用户合法。具体的实现就是去检查这个JWT是否过期,用户名是否正确。
- /api/v1/auth/refresh
JWT有一个Expire过期时间,当用户还在使用的时候,JWT需要刷新。就使用刷新令牌进行刷新,经过服务器验证之后,返回一个新的刷新令牌。
- /api/v1/auth/logout
退出登录,需要在客户端本地删除token,并且把刷新令牌revoke
查阅资料:刷新Token的策略
刷新令牌(Refresh Token)
定义: 刷新令牌是一种用于获取新的访问令牌(Access Token)的凭证,通常在访问令牌过期后使用,以避免用户频繁重新登录。
工作原理:
- 用户首次登录时,服务器颁发一个访问令牌和一个刷新令牌。
- 访问令牌用于访问受保护的资源,具有较短的有效期。
- 当访问令牌过期时,客户端使用刷新令牌向服务器请求新的访问令牌。
- 服务器验证刷新令牌的有效性,如果有效,则颁发新的访问令牌,并可能同时颁发新的刷新令牌。
优点:
- 提高用户体验,减少频繁登录的需求。
- 访问令牌具有较短的有效期,降低安全风险。
缺点:
- 需要妥善保护刷新令牌,因为刷新令牌的泄露可能导致长期的安全问题。
- 实现强制注销或更改密码后立即失效所有令牌比较困难。
缓存令牌(Cached Token)
定义: 缓存令牌是指将令牌存储在缓存系统(如Redis)中,以便快速验证和撤销令牌。
工作原理:
- 用户登录后,服务器生成一个令牌并将其存储在缓存系统中。
- 客户端在访问受保护的资源时,携带令牌。
- 服务器从缓存系统中验证令牌的有效性。
- 如果需要撤销令牌,服务器可以从缓存系统中删除该令牌。
优点:
- 快速验证和撤销令牌,提高系统的响应速度。
- 灵活的令牌管理,可以随时撤销某个令牌。
缺点:
- 增加了系统的复杂性,需要维护缓存系统。
- 依赖外部服务,如果缓存系统出现故障,会影响整个系统的正常运行。
双令牌机制(Dual Token Mechanism)
定义: 双令牌机制是指使用两种不同类型的令牌来实现更复杂的授权和身份验证流程。
工作原理:
- 用户通过身份验证后,服务器颁发一个身份验证令牌(例如JWT)和一个授权令牌(例如OAuth 2.0的访问令牌)。
- 身份验证令牌用于证明用户的身份,通常具有较长的有效期。
- 授权令牌用于访问受保护的资源,通常具有较短的有效期。
- 当授权令牌过期时,客户端可以使用身份验证令牌向服务器请求新的授权令牌。
优点:
- 身份验证令牌具有较长的有效期,减少用户频繁登录的需求。
- 授权令牌具有较短的有效期,降低安全风险。
- 可以实现更复杂的授权策略。
缺点:
- 实现和管理双令牌机制比单一令牌机制更复杂。
- 需要妥善保护身份验证令牌,因为身份验证令牌的泄露可能导致长期的安全问题。
总结
- 刷新令牌主要用于在访问令牌过期后获取新的访问令牌,减少用户频繁登录的需求。
- 缓存令牌通过将令牌存储在缓存系统中,实现快速验证和撤销令牌。
- 双令牌机制使用两种不同类型的令牌来实现更复杂的身份验证和授权流程。
每种机制都有其适用的场景和优缺点,选择合适的机制需要根据具体的安全需求和业务场景来决定。
实现
最后经过和队友的商讨,最终选择了刷新令牌的策略。并且在服务端实现刷新令牌的存储,以达到能够实现刷新令牌revoke的功能。
接口
- /api/v1/auth/login
登录接口允许用户输入用户名和密码进行登录,服务器验证成功后,会返回一个JWT访问令牌和刷新令牌和他们各自的过期时间。都会存储在客户端的本地存储中
- /api/v1/auth/register
用户注册,填写用户的基本信息,在服务器的数据库上进行注册
- /api/v1/auth/verify
用户在拿着访问令牌去访问别的微服务的时候,我们要先验证这个访问令牌的合法性。确保用户合法。具体的实现就是去检查这个JWT是否过期,签名是否正确等。
- /api/v1/auth/refresh
JWT有一个Expire过期时间,当用户还在使用的时候,JWT需要刷新。就使用刷新令牌进行刷新,经过服务器验证之后,返回一个新的刷新令牌。
- /api/v1/auth/logout
退出登录,需要在客户端本地删除token,并且把刷新令牌revoke掉。
优势和还存在的问题的权衡
JWT本来是无状态的,就可以避免服务器维护状态的额外开销。但是如果令牌泄漏之后存在安全风险,而我们又无法阻止这个有被劫持风险的令牌去访问我们的服务,这就会可能会造成用户的损失。
我们对于颁发的刷新令牌不予更新,每当刷新令牌过期之后,用户通过重新登录获取。访问令牌的过期时间较短,大约可设置为1小时;刷新令牌的过期时间长一些,可以设置为1天或更长。如果访问令牌被劫持,由于他的过期时间很短,造成的损失不会很大。当发现刷新令牌被盗用之后,用户可以实现重新登录获得新的刷新令牌,在服务端维护一个用户对应一个没有被revoke的刷新令牌。