使用渡槽的 OAuth 错误,ManagedPropertyType 不匹配

OAuth Error using Aqueduct, mismatched ManagedPropertyType

我正在使用新创建的 Aqueduct 项目提供的 OAuth 挂钩。我的数据是按以下方式编码的 URI:

var form = body.keys
    .map((key) => "$key=${Uri.encodeQueryComponent(body[key])}")
    .join("&");

我在尝试注册用户时收到以下错误消息:

DataModelException:_User 上 属性 用户名的类型不匹配,预期可分配类型匹配 ManagedPropertyType.string 但得到 _ImmutableList。 #0 ManagedValueBacking.setValueForProperty

请求如下所示:

HttpRequest.request('/register', method: 'POST',
    sendData: form,
    requestHeaders: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Basic $clientCredentials"
}).then((HttpRequest req) {
    ...
}).catchError((e) => _handleError(...));

我不太确定为什么 body 被解释为 ImmutableList。

我一定是漏了什么!

/register 端点需要 JSON 数据。

HttpRequest.request('/register', method: 'POST',
    sendData: JSON.encode(body),
    requestHeaders: {
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": "Basic $clientCredentials"
});

不幸的是,这不是很清楚 - HTTPController 默认允许 JSON 和表单数据,现在更改它可能会破坏某些人的代码;不过,该模板可以做得更好 restricting input to JSON only

这个错误的具体原因是表单数据和查询参数可以有同一个键的多个条目。 Aqueduct 将表单数据和查询参数视为相同,并始终将这些类型的输入解析为列表。由于 RegisterController 是一个 QueryController<T>,它需要一个 JSON 请求主体,其中每个值都不是列表。

而不是切换到 JSON,您可以随时修改 RegisterController 以仅采用表单数据:

class RegisterController extends HTTPController {
  RegisterController(this.authServer) {
    acceptedContentTypes = [new ContentType("application", "x-www-form-urlencoded")];
  }
  AuthServer authServer;

  @httpPost
  Future<Response> createUser(
    @HTTPQuery("username") String username,
    @HTTPQuery("password") String password) async {

    var query = new Query<User>()
      ..values.username = username
      ..values.password = password;

    var salt = AuthUtility.generateRandomSalt();
    ...

注意:授权端点 期望 表单数据(根据 OAuth 2.0 规范),但新项目中的所有其他内容都期望 JSON 数据。