Ktor OAuth grant_type为password时loadTokens逻辑不执行问题求助
问题根因
你当前的写法是把if(user == null)的判断逻辑写在了loadTokens方法的外层,而Ktor的认证插件配置是服务启动阶段执行的全局静态配置,启动时user必然为null,所以else分支的loadTokens配置根本没有生效,运行时触发的永远是client_credentials对应的逻辑,自然不会走到password的方法体里。
解决方法
把用户判断的逻辑移到loadTokens的lambda内部,该lambda是每次需要获取/刷新token时才会执行的运行时代码,此时可以正确拿到当前请求关联的用户信息,正确配置示例如下:
install(Authentication) { bearer { // 开启失效自动刷新token refreshTokensOnFailure = true loadTokens { // 从当前请求上下文获取登录用户信息,根据你实际的principal类型调整 val user = call.principal<User>() if (user == null) { val tokens = tokenClient.submitForm<FaOAuthResult>("https://sandbox.xxx.io/oauth/token", Parameters.build { append("grant_type", "client_credentials") append("client_id", "xxx") append("client_secret", "xxx") }) BearerTokens( accessToken = tokens.access_token, refreshToken = tokens.access_token ) } else { val tokens = tokenClient.submitForm<FaOAuthResult>("https://sandbox.xxx.io/oauth/token", Parameters.build { append("grant_type", "password") append("client_id", "xxx") append("client_secret", "xxx") append("username", user.finapiUserId!!) append("password", user.finapiPassword!!) }) BearerTokens( accessToken = tokens.access_token, refreshToken = tokens.access_token ) } } } }
附加排查点
- 确认你的
tokenClient已经安装Logging插件,且日志级别设置为DEBUG及以上,才能输出完整的请求日志。 - 检查
user.finapiUserId和user.finapiPassword是否存在空值,!!操作符触发的空指针如果被上层逻辑捕获吞掉,也会出现方法体看起来没执行的现象,可以先加日志打印这两个参数的值确认可用性。 - 确认你触发测试的路由已经配置了Authentication校验,只有走认证逻辑的路由才会触发
loadTokens执行。
内容的提问来源于stack exchange,提问作者gabs
相关产品推荐
相关产品推荐

