Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否在oauth上缓存访问令牌?_Java_Oauth - Fatal编程技术网

Java 是否在oauth上缓存访问令牌?

Java 是否在oauth上缓存访问令牌?,java,oauth,Java,Oauth,我目前正在使用oauth2和Google实现身份验证 我读到应该缓存访问令牌以备将来使用,但我真的需要这样做吗 我考虑在会话中加密存储它。如果到期,我会得到一个新的代币 另外,如果我需要缓存令牌,我如何知道它属于哪个用户 我读到应该缓存访问令牌以备将来使用,但我确实需要这样做吗 真的需要这样做吗 是的,这就是OAuth的用途。需要使用访问令牌,让您的应用程序能够访问服务提供商的资源,而无需每次提供用户名和密码 我考虑在会话中加密存储它。如果是 到期后,我将获得一个新令牌 看起来你把事情搞混了。会

我目前正在使用oauth2和Google实现身份验证

我读到应该缓存访问令牌以备将来使用,但我真的需要这样做吗

我考虑在会话中加密存储它。如果到期,我会得到一个新的代币

另外,如果我需要缓存令牌,我如何知道它属于哪个用户

我读到应该缓存访问令牌以备将来使用,但我确实需要这样做吗 真的需要这样做吗

是的,这就是OAuth的用途。需要使用访问令牌,让您的应用程序能够访问服务提供商的资源,而无需每次提供用户名和密码

我考虑在会话中加密存储它。如果是 到期后,我将获得一个新令牌

看起来你把事情搞混了。会话和访问令牌的过期是不同的。访问令牌的使用寿命通常比会话长得多(例如,令牌:60分钟,会话:15分钟)

如果访问令牌过期,则需要刷新令牌来获取新的访问令牌。如果没有刷新令牌,则必须再次启动授权流以获取新的访问令牌

另外,如果我需要缓存令牌,我如何知道该令牌是给哪个用户的 属于谁

这是你的责任,在你的数据库中的某个地方保持连接。服务提供商(在您的例子中是谷歌)也会在其端执行相同的操作,以便将访问令牌与用户/资源相匹配。关于第二点:您还应该存储刷新令牌



我建议您阅读这里的内容:

您一定要缓存访问令牌。生成访问令牌的成本很高,而且通常会有较长的过期时间,因此可以多次重用,避免每次都用新的请求轰炸身份验证服务器

例如,这里是Scala中缓存的一个非常简单的实现。实现oauth操作(getToken、refreshToken等)的类

class authHandler private(serviceURL: java.net.URL) {

  def getToken(clientId: String,
               clientSecret: String,
               scope: String,
               resource: String = ""): Future[String] = {

    val cacheKey = clientId + scope

    S2SAuthHandler.getTokenFromCache(cacheKey) match {
      case Some(tk) => Future(tk)
      case None => requestTokenFromServer(clientId, clientSecret, scope, resource)
    }
  }

  private def requestTokenFromServer(clientId: String,
                                     clientSecret: String,
                                     scope: String,
                                     resource: String): Future[String] = {

        val authToken = <http request from server>

//expiration time is set to a few seconds less than the one provided from the server, to avoid returning an already expired token. 
        authToken.expires = authToken.expires - 5 + System.currentTimeMillis() / 1000  S2SAuthHandler.storeTokenToCache(clientId + scope, authToken)


    authToken.accessToken      
    }
}
/** Companion objec  */
object authHandler {

  private val tokenCache = mutable.Map.empty[String, AuthToken]

  private def getTokenFromCache(cacheKey: String): Option[String] = {
    if ((tokenCache contains cacheKey) && (tokenCache(cacheKey).expires > System.currentTimeMillis / 1000)) {
      Some(tokenCache(cacheKey).accessToken)
    }
    else {
      None
    }
  }

  private def storeTokenToCache(key: String, tk: AuthToken) = {
    tokenCache(key) = tk

//Depending on your execution environment, I would recommend to encrypt the token before storing in the cache
   }
}