首页 > 解决方案 > 使用 AuthController 传递用户 ID

问题描述

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

 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);
  }

标签: flutterdartaqueduct

解决方案


颤振前端

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

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

渡槽后端

您可以在后端使用所有您想要的用户 ID。不过,我不知道有必要将它们传递给客户。在后端,您可以查询用户 ID,然后使用它从数据库中获取其他信息。

这是文档中的一个示例:

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());
  }
}

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

您的其他表可以有一个用户 ID 列,以便只有该用户可以保存和检索他们的数据。在上面的示例中,Posts 有一个 Author,而 Author 有一个 ID,即用户 ID。

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

相当于

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

您可以在文档的“高级查询”部分阅读相关内容。


推荐阅读