3

我知道如何实现注册用户的路线,以及如何用用户凭证换取访问令牌。这些都包含在官方教程中。

如何使注册用户的访问令牌(和刷新令牌)失效。如果用户的帐户被盗,这对于注销和限制损害都是必要的。

我看到有一个方法

authServer.revokeAllGrantsForResourceOwner(identifier)

但我仍在研究如何从用户那里获取标识符,因为客户端应用程序知道用户名,但不知道服务器数据库中的用户 ID。最好只传递当前令牌并让服务器取消该用户的所有令牌。

4

1 回答 1

3

如果要撤销给定令牌的所有令牌,请从授权令牌中获取用户 ID 并对该用户的令牌运行删除查询:

class TokenManagerController extends ResourceController {
  @Operation.delete()
  Future<Response> deleteTokens() async {
    final userId = request.authorization.ownerID;

    final query = Query<ManagedAuthToken>(context)
      ..where((token) => token.resourceOwner).identifiedBy(userId);
    final count = await query.delete();

    return Response.ok({"userId": userId, "tokensDeleted": count});
  }
}

并确保您链接授权人:

router.route("/tokens")
      .link(() => Authorizer.bearer(authServer))
      .link(() => TokenManagerController(context));

FWIW,我建议专门为此操作设置一个范围,该范围仅通过附加登录授予此场景。用户体验是用户必须再次输入密码。

如果您只想删除一个令牌,只需运行删除查询 where access_token= 授权标头中的令牌。

class LogoutController extends ResourceController {
  @Operation.delete()
  Future<Response> deleteTokens(@Bind.header('authorization') String authHeader) async {

    final parser = AuthorizationBearerParser();
    final userToken = parser.parse(authHeader);

    final query = Query<ManagedAuthToken>(context)
      ..where((token) => token.accessToken).equalTo(userToken);
    final count = await query.delete();

    final userId = request.authorization.ownerID;
    return Response.ok({"userId": userId, "tokensDeleted": count});
  }
}
于 2019-05-22T13:32:50.497 回答