管理身份验证令牌的最佳做法

2022-09-01 10:58:32

我正在使用HttpCLient用Java编写一个REST客户端,我访问的REST API需要每个REST操作的身份验证令牌。此令牌的有效期为 24 小时。

我现在处理这个问题的方式是每次我需要进行REST调用时调用“”方法,这似乎是身份验证服务器上的开销。getAuth()

如何方便地存储此身份验证令牌并管理其生命周期?是否有任何记录在案的最佳实践?

我想到了以下解决方案

public class MySession {
    String user;
    String pass;
    public MySession(String user, String pass) {
        this.user = user;
        this.pass = pass;
    }

    public getAuth() {
        //user user, pass to get auth token 
    }
}

,然后将会话对象传递给任何需要令牌的类。如果令牌已过期,只需再次调用此方法


答案 1

为简洁起见,我假设您正在调用无法更改的终结点。应如何实现将在很大程度上取决于令牌是基于应用还是基于用户(共享应用实例上的所有用户一个令牌或每个用户一个令牌)。

如果它是整个应用的一个身份验证令牌:

  • 将其与生存时间时间戳一起存储在内存中(或者捕获令牌过期错误,请求新令牌并重试原始请求),如果不存在/已过期,请刷新它
  • 如果您担心在应用程序重新启动后重新请求 API 令牌,也应将其存储在数据库中,并在启动时加载(如果存在)

如果是每个用户一个令牌:

  • 将其存储在您的用户会话中,它正是会话的用途,如果您正在对用户进行身份验证,那么他们将有一个会话并且开销已经存在
  • 如果您不想在每次登录时重新请求令牌,请将当前令牌存储在数据库中,并在登录时将其加载到会话中

答案 2

我假设您正在使用OAuth进行授权。您使用的是 JWT 还是其他令牌与这种情况无关。

执行授权时,将向您授予过期,并且根据您请求的授权类型(客户端凭据、授权代码、隐式、资源所有者),您将获得 一个 .access_tokenrefresh_token

客户端应保持 和 的过期时间。refresh_token(如果发出)必须保密(请注意,不要针对您的用例使用正确的授权)。access_token

在后续调用中,客户端不应在每次调用时请求新令牌,而应使用存储的 .access_token

一旦 API 开始返回,可能就已经过期了。您的客户应该尝试刷新使用,如果你有一个。401 Unauthorizedaccess_tokenaccess_tokenrefresh_token

如果没有,或者刷新请求也失败,因为 不再有效,您可以执行新的授权流。refresh_tokenrefresh_token

您可以使用过期时间作为线索,了解何时通过刷新或通过新的完全授权流获取新的授权流。这将避免 .在任何情况下,在对某些调用使用有效响应后收到此响应时,客户端都应具有回退策略。access_token401 Unauthorizedaccess_token


推荐