Ktor - 只为某些 url 应用不记名令牌
Ktor - Only apply bearer tokens for certain urls
在我的项目中,有些网络请求需要通过不记名令牌进行身份验证,有些则不需要。有没有办法指定不需要不记名令牌的网址?如果我只添加 Auth 插件,那么对于不需要承载令牌的网络调用,我总是会收到 401 响应。
这是我现在的实现:
interface MyService {
...
companion object Factory {
fun build(getToken: GetToken, login: Login, saveToken: SaveToken): MyService {
return MyServiceImpl(httpClient = HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer(
kotlinx.serialization.json.Json {
ignoreUnknownKeys = true
}
)
}
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.HEADERS
}
install(Auth) {
lateinit var tokenInfo: TokenInfo
bearer {
refreshTokens {
getRefreshedTokens(
tokenInfo = tokenInfo,
login = login,
saveToken = saveToken
)
}
loadTokens {
tokenInfo = getToken.execute().firstOrNull() ?: TokenInfo(
Constants.EMPTY_STRING, Constants.EMPTY_STRING
)
BearerTokens(
accessToken = tokenInfo.accessToken,
refreshToken = tokenInfo.refreshToken
)
}
}
}
})
}
...
}
}
不记名令牌只不过是一个 header Authorization: Bearer XXX
- 如果您正在寻找一种技术特定的方法来处理这个问题(放入某些模块等),那么您可能 out-of-luck
然而,这个问题在我的生活中经常出现——解决方案是实际动态地操作 headers——基本上,使用策略模式。如果您可以创建客户端的实例,那么每个实例都会有自己的策略。如果不能,则安装一个函数,该函数在每次请求时都会被调用,以根据您需要的任何逻辑确定 header。
在您的情况下,自定义:
install(Auth) {
// your code here
}
您可以按某些条件过滤请求,这些条件最初应包括 Authorization
header。对于每个其他请求,如果服务器以 [=13=] 状态回复,则将发出具有 Authorization
header 的第二个请求。这是一个示例配置:
val client = HttpClient {
install(Auth) {
bearer {
sendWithoutRequest { request -> request.url.encodedPath.startsWith("/restricted") }
// ...
}
}
}
在我的项目中,有些网络请求需要通过不记名令牌进行身份验证,有些则不需要。有没有办法指定不需要不记名令牌的网址?如果我只添加 Auth 插件,那么对于不需要承载令牌的网络调用,我总是会收到 401 响应。
这是我现在的实现:
interface MyService {
...
companion object Factory {
fun build(getToken: GetToken, login: Login, saveToken: SaveToken): MyService {
return MyServiceImpl(httpClient = HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer(
kotlinx.serialization.json.Json {
ignoreUnknownKeys = true
}
)
}
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.HEADERS
}
install(Auth) {
lateinit var tokenInfo: TokenInfo
bearer {
refreshTokens {
getRefreshedTokens(
tokenInfo = tokenInfo,
login = login,
saveToken = saveToken
)
}
loadTokens {
tokenInfo = getToken.execute().firstOrNull() ?: TokenInfo(
Constants.EMPTY_STRING, Constants.EMPTY_STRING
)
BearerTokens(
accessToken = tokenInfo.accessToken,
refreshToken = tokenInfo.refreshToken
)
}
}
}
})
}
...
}
}
不记名令牌只不过是一个 header Authorization: Bearer XXX
- 如果您正在寻找一种技术特定的方法来处理这个问题(放入某些模块等),那么您可能 out-of-luck
然而,这个问题在我的生活中经常出现——解决方案是实际动态地操作 headers——基本上,使用策略模式。如果您可以创建客户端的实例,那么每个实例都会有自己的策略。如果不能,则安装一个函数,该函数在每次请求时都会被调用,以根据您需要的任何逻辑确定 header。
在您的情况下,自定义:
install(Auth) {
// your code here
}
您可以按某些条件过滤请求,这些条件最初应包括 Authorization
header。对于每个其他请求,如果服务器以 [=13=] 状态回复,则将发出具有 Authorization
header 的第二个请求。这是一个示例配置:
val client = HttpClient {
install(Auth) {
bearer {
sendWithoutRequest { request -> request.url.encodedPath.startsWith("/restricted") }
// ...
}
}
}