如何让Aqueduct服务器返回Refresh Token?
我之前也碰到过一模一样的情况,其实Aqueduct的AuthServer返回refresh token是有明确前置条件的,咱们一步步来排查解决:
1. 先确认你用的授权类型(Grant Type)
只有当请求/auth/token时使用**password或者authorization_code**这两种授权类型,AuthServer才会自动生成并返回refresh token。如果你的请求用的是client_credentials类型,那确实不会返回——因为这种模式下不需要刷新token。
你可以检查一下请求参数,确保grant_type的值是password,同时带上正确的username和password参数,比如用form-data提交:
grant_type: password username: 你的用户名 password: 你的密码
2. 检查你的User模型是否正确继承了ManagedAuthResourceOwner
这是很容易忽略的点:你的User类必须继承自ManagedAuthResourceOwner,而不是普通的ManagedObject。这个父类内置了和授权相关的字段(比如refresh token的关联存储)以及逻辑,没有它的话,AuthServer根本没法生成refresh token。
正确的User类写法应该是这样的:
class User extends ManagedAuthResourceOwner<_User> { @override @Serialize(input: true, output: false) String password; } class _User extends ManagedAuthResourceOwnerTable {}
3. 如果用了客户端认证,检查客户端的配置
如果你的请求里还带了client_id和client_secret,那要确保数据库里对应的客户端记录开启了refresh token权限。创建客户端的时候,需要把allowRefreshTokens设为true(默认可能是false):
final client = AuthClient() ..clientID = "你的客户端ID" ..secret = "你的客户端密钥" ..allowRefreshTokens = true; // 这个配置必须有 await context.insertObject(client);
4. (可选)自定义AuthController确认响应
如果上面几步都没问题还是不返回,你可以临时自定义一个AuthController,看看响应的生成过程:
class CustomAuthController extends AuthController { CustomAuthController(AuthServer server) : super(server); @override Future<Response> handle(Request request) async { final response = await super.handle(request); // 这里可以打印响应内容,确认是否有refresh_token print("Auth response: ${response.body}"); return response; } }
然后把路由里的AuthController换成这个自定义的,看看日志里的响应内容——不过正常情况下,满足前面三个条件的话,这里应该能看到refresh token。
总的来说,最常见的问题就是授权类型不对,或者User模型没继承对。先检查这两点,大概率就能解决问题了。
内容的提问来源于stack exchange,提问作者Suragch

