0

我正在构建一个符合 U2F 的客户端,只需将具有以下结构的 JSON 对象发送到 POST URL:

{
  challenge: [Base64-encoded String of 32 bytes],
  registrationData: [Base64-encoded String of variable bytes]
}

这是我的代码的摘录,它运行良好并且没有引发错误:

import okhttp3.FormBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public interface Registration {
  @POST("register")
  Call<ResponseBody> register(@Body RequestBody body);
}

private void sendRegistrationResponse(String baseURL, String challenge, String data) {
  RequestBody data = new FormBody.Builder()
                    .add("challenge", challengeB64)
                    .add("registrationData", data)
                    .build();

  Retrofit retro = new Retrofit.Builder()
                    .baseUrl(info.getString("baseURL"))
                    .build();

  U2FServices.Registration reg = retro.create(U2FServices.Registration.class);
  Call<ResponseBody> regCall = reg.register(data);
  regCall.enqueue(this);
}

调试服务器是用Node搭建的,它的POST“注册”路由每次都被客户端成功调用。问题是,请求的主体总是空的。

exports.register = function (req, res) {
  var body = req.body; // {}
}

我想问题出在 . 上FormBody.Builder(),但我找不到任何文档或代码来说明它是如何工作的。任何帮助是极大的赞赏!

4

1 回答 1

3

让我们试试这个——(希望你的节点服务器期待应用程序/json),否则我们需要改变那部分。

RequestBody data = RequestBody.create(MediaType.parse("application/json"), stringJson);

显然,FormBody 的默认媒体类型是“application/x-www-form-urlencoded”,如果您的节点服务器不期望这种请求类型,它可能会失败。

如果您可以查看节点的配置,最好检查一下以确保请求应该使用什么媒体类型。

这是具有快速服务器配置的节点示例。

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

此节点服务器可以预期 json 和表单 url 编码。

让我知道这是否有效。

于 2016-06-23T18:46:35.297 回答