如何为 Aqueduct 服务器上的用户注销(即撤销、删除或使令牌无效)?
How to logout (ie, revoke, delete, or invalidate the tokens) for a user on an Aqueduct server?
我知道如何实现注册用户的路由以及如何用用户凭据换取访问令牌。这些都包含在官方tutorial中。
如何使注册用户的访问令牌(和刷新令牌)失效。如果用户的帐户受到威胁,这对于注销和限制损害都是必要的。
我看到有一个方法
authServer.revokeAllGrantsForResourceOwner(identifier)
但我仍在研究如何从用户那里获取标识符,因为客户端应用程序知道用户名,但不知道服务器数据库中的用户 ID。最好只传递当前令牌并让服务器取消该用户的所有令牌。
如果您想撤销给定令牌的所有令牌,请从授权令牌中获取用户 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});
}
}
并确保您 link 是授权人:
router.route("/tokens")
.link(() => Authorizer.bearer(authServer))
.link(() => TokenManagerController(context));
FWIW,我建议专门为此操作设置一个范围,该范围仅通过额外登录授予此方案。 UX是用户必须再次输入密码。
如果您只想删除一个令牌,只需 运行 一个删除查询,其中 access_token
= 授权中的令牌 header。
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});
}
}
我知道如何实现注册用户的路由以及如何用用户凭据换取访问令牌。这些都包含在官方tutorial中。
如何使注册用户的访问令牌(和刷新令牌)失效。如果用户的帐户受到威胁,这对于注销和限制损害都是必要的。
我看到有一个方法
authServer.revokeAllGrantsForResourceOwner(identifier)
但我仍在研究如何从用户那里获取标识符,因为客户端应用程序知道用户名,但不知道服务器数据库中的用户 ID。最好只传递当前令牌并让服务器取消该用户的所有令牌。
如果您想撤销给定令牌的所有令牌,请从授权令牌中获取用户 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});
}
}
并确保您 link 是授权人:
router.route("/tokens")
.link(() => Authorizer.bearer(authServer))
.link(() => TokenManagerController(context));
FWIW,我建议专门为此操作设置一个范围,该范围仅通过额外登录授予此方案。 UX是用户必须再次输入密码。
如果您只想删除一个令牌,只需 运行 一个删除查询,其中 access_token
= 授权中的令牌 header。
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});
}
}