使用 AuthController 传递用户 ID

Passing user id with AuthController

我刚刚使用 aqueduct 作为后端制作了简单的身份验证应用程序。我使用渡槽文档页面中的代码进行登录和注册。当我在后端使用此代码登录时

 router
    .route('/auth/token')
    .link(() => AuthController(authServer));

我得到了令牌、令牌类型和到期日期,还有机会传递 userId 吗?还是我必须创建自己的控制器才能做到这一点?

更新 或者我如何在我的后端保存数据时保存用户 ID

  @Operation.post()
  Future<Response> addData(@Bind.body(ignore: ['id']) Data newData) async {
    final query = Query<Data>(context)..values = newData;
    final insertData = await query.insert();
    return Response.ok(insertData);
  }

Flutter 前端

最初使用 username/email 和密码登录。如果用户名和密码有效,您将从服务器获得授权令牌。然后使用该令牌向服务器发出进一步的特权请求。

您不需要在客户端上保存有关用户的任何个人数据(电子邮件或密码)。不过,如果您不想让用户在下次使用该应用程序时再次登录,您可以保存令牌。保存令牌时,您应该使用安全存储选项。 Android 上的 flutter_secure_storage plugin uses KeyChain on iOS and KeyStore

渡槽后端

您可以在后台随意使用用户 ID。不过,我不知道是否需要将它们传递给客户。在后端,您可以查询用户 ID,然后使用它从数据库中获取其他信息。

这是来自 documentation 的示例:

class NewsFeedController extends ResourceController {
  NewsFeedController(this.context);

  ManagedContext context;

  @Operation.get()
  Future<Response> getNewsFeed() async {
    var forUserID = request.authorization.ownerID;

    var query = Query<Post>(context)
      ..where((p) => p.author).identifiedBy(forUserID);

    return Response.ok(await query.fetch());
  }
}

客户端只传入了token。 Aqueduct 根据该令牌为您查找用户 ID。现在您知道了用户 ID。

您的其他表可以有一个用户 ID 列,这样只有该用户可以保存和检索他们的数据。上面的例子中,Posts有一个Author,Author有一个ID,也就是用户ID。

where((p) => p.author).identifiedBy(forUserID)

等同于

where((p) => p.author.id).equalTo(forUserID)

您可以在文档的 Advanced Queries 部分阅读相关内容。