Android刷新令牌

9
我正在开发一个Android应用程序,关于token和refresh token我有些困惑。 基本上现在,用户使用手机号码和通过短信发送的代码登录后,认证服务器将返回一个访问令牌,该访问令牌将用于访问所有api。对于认证服务器,我使用了带有jwt-auth库的Laravel。 当访问令牌过期时,我将使用存储在AccountManager中的用户凭据来请求新的访问令牌。 这是实现此身份验证的正确方法吗?
还是我缺少refresh token,在访问令牌过期时请求新的访问令牌?
谢谢您提前回答, Daniele

1
永远不要将用户凭据存储在本地数据库中。您应该使用刷新令牌。 - Tomer Shemesh
1个回答

19

我认为最好同时使用tokenrefresh token,这样当你的access token过期时就不必每次都发送你的凭据。此外,在客户端设备上存储用户凭据是不安全的,你应该将这些信息存储在服务器上,并在需要时要求用户输入。

这里是我实现token/refresh token过程的方法:

1:你向身份验证服务器发送你的credentials(它将向你发送一个access token(我使用的是未存储在数据库中的JSON web token类型)和一个refresh token(存储在数据库中)。

2:当你向服务器发出请求时,检查access token是否过期,如果过期,则使用refresh token向身份验证服务器发出请求,以获得新的access token(根据你的服务器配置,它可以返回一个新的access token或我更喜欢的新的access tokenrefresh token配对)。

3:如果refresh token过期,则使用你的credentials向服务器发出请求,以获得新的令牌对。


谢谢Frederic。最终我使用了Laravel的JWT-auth库(https://github.com/tymondesigns/jwt-auth/wiki),使用以下过程:
  1. 用户将其凭据发送到认证服务器
  2. 使用该库创建访问令牌
  3. 将此令牌存储为Android的AccountManager类中的密码
  4. 当令牌过期时,使用它请求新令牌
  5. 如果请求新令牌失败,则要求用户重新发送凭据。
您认为这是正确的过程吗?
- Lic
通常我们使用刷新令牌来限制客户端凭据在发送到身份验证服务时的使用。 "访问令牌的生存时间越短,客户端凭据就越频繁地被用于获取新的访问令牌,因此攻击者就有更多机会破坏客户端凭据。因此,如果您有一个单次使用的刷新令牌,则可以使访问令牌的ttl任意小,而不会危及客户端凭据。" 在https://dev59.com/5nA75IYBdhLWcg3wFEsI上。 - Frédéric
1
@Frédéric:如果您的刷新令牌泄漏,例如由于已经root的Android手机-->那么攻击者可以不断更新令牌。 您为每个用户生成唯一的刷新令牌吗? - j10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接