gpt4 book ai didi

java - 在 Java8 标准环境下使用 Spring OAuth 的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:58 26 4
gpt4 key购买 nike

我的示例应用程序适用于本地环境。但是,它不适用于 Java8 标准环境。以下项目是示例应用程序项目。

https://github.com/nosix/appengine-java8-spring-oauth2

Java8标准环境出现如下错误:

Authentication Failed: Could not obtain access token

我在Spring OAuth的源码中添加了日志,排查了原因。错误原因好像是session数据丢失了。

它的操作如下:

preservedStateAuthorizationCodeAccessTokenProvider::getParametersForTokenRequest 中为 null。因此,将抛出 InvalidRequestException。这是错误的原因。

setPreservedState 方法在 OAuth2RestTemplate::acquireAccessToken 中被调用。那时,preservedState 被设置为 null。

DefaultOAuth2ClientContext 实例具有 preservedStateDefaultOAuth2ClientContext实例的preservedState在Java8标准环境下为null。但是,它在本地环境中不为空。

DefaultOAuth2ClientContext 实例存储在 session 中。我理解它在本地环境中存储在内存中,在标准环境中存储在数据存储中。

从上面推测是session数据丢失了。

我被困在调查中。是否有信息作为求解的线索?

最佳答案

我遇到了同样的问题。最后我实现了一个Spring Session的自定义SessionRepository如下:(see also this commit)

存储库类:

class MemcacheSessionRepository(private val memcacheService: MemcacheService) : SessionRepository<MemcacheSession> {
private val log = LoggerFactory.getLogger(javaClass)
private val maxInactiveIntervalInSeconds: Int = 3600

override fun createSession() = MemcacheSession().also { session ->
session.maxInactiveIntervalInSeconds = maxInactiveIntervalInSeconds
log.debug("createSession() = {}", session.id)
}

override fun save(session: MemcacheSession) {
log.debug("save({}) with expiration {}", session.id, session.maxInactiveIntervalInSeconds)
memcacheService.put(session.id, session, Expiration.byDeltaSeconds(session.maxInactiveIntervalInSeconds))
}

override fun getSession(id: String): MemcacheSession? =
(memcacheService.get(id) as? MemcacheSession)?.also { session ->
session.setLastAccessedTimeToNow()
}.also { session ->
log.debug("getSession({}) = {}", id, session?.id)
}

override fun delete(id: String) {
log.debug("delete({})", id)
memcacheService.delete(id)
}
}

实体类:

class MemcacheSession : ExpiringSession, Serializable {
companion object {
const val serialVersionUID: Long = 1
}

private val id: String = UUID.randomUUID().toString()
private val creationTime: Long = System.currentTimeMillis()
private var lastAccessedTime: Long = creationTime
private var maxInactiveIntervalInSeconds: Int = 3600
private val attributes: MutableMap<String, Any> = mutableMapOf()

override fun getId() = id

override fun getCreationTime() = creationTime

override fun getLastAccessedTime() = lastAccessedTime
override fun setLastAccessedTime(time: Long) {
lastAccessedTime = time
}
fun setLastAccessedTimeToNow() {
lastAccessedTime = System.currentTimeMillis()
}

override fun getMaxInactiveIntervalInSeconds() = maxInactiveIntervalInSeconds
override fun setMaxInactiveIntervalInSeconds(interval: Int) {
maxInactiveIntervalInSeconds = interval
}

override fun removeAttribute(key: String) {
attributes.remove(key)
}

override fun getAttributeNames() = attributes.keys

override fun <T> getAttribute(key: String): T? = attributes[key] as T?

override fun setAttribute(key: String, value: Any) {
attributes.put(key, value)
}

override fun isExpired() = false
}

目前这似乎运行良好,但它仅使用 Memcache 并且需要改进以实现高可用性。

关于java - 在 Java8 标准环境下使用 Spring OAuth 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45217234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com