【问题标题】:POST Request to sendEmail endpoint causes org.json.JSONException: JSONObject["oobCode"] not found. after calling gitkitClient.getOobResponse(request);对 sendEmail 端点的 POST 请求导致 org.json.JSONException: JSONObject["oobCode"] not found。在调用 gitkitClient.getOobResponse(request);
【发布时间】:2016-03-24 17:35:42
【问题描述】:

我正在尝试在我的后端实现“登录时出现问题”链接端点。我按照enumerated here 的步骤进行操作,并通过我的 Gitkit Widget JavaScript 成功获取了 POST 请求,但请求中似乎缺少一些信息。

我一打电话

OobResponse oobResponse = Utils.getGitkitClient().getOobResponse(request);

以下堆栈跟踪被抛出。为简洁起见,我将只包括前几行。

com.google.identitytoolkit.GitkitServerException: org.json.JSONException: JSONObject["oobCode"] not found.
    at com.google.identitytoolkit.GitkitClient.getOobResponse(GitkitClient.java:411)
    at com.google.identitytoolkit.GitkitClient.getOobResponse(GitkitClient.java:372)
    at myProject.myController.sendEmail(myController.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
...

为了排除这个问题的可能原因,以下是我用来获取 GitkitClient 实例的实用方法的内容:

public static GitkitClient getGitkitClient() throws FileNotFoundException {
    GitkitClient gitkitClient = GitkitClient
            .newBuilder()
            .setGoogleClientId(Constants.CLIENT_ID)
            .setServiceAccountEmail(Constants.SERVICE_ACCOUNT_EMAIL)
            .setKeyStream(new FileInputStream(Constants.SERVICE_ACCOUNT_PRIVATE_KEY_FILE_PATH))
            .setWidgetUrl(Constants.WIDGET_URL)
            .setCookieName(Constants.COOKIE_NAME)
            .build();
    return gitkitClient;
}

这是我的 sendEmail 端点方法签名(我使用的是 Spring Boot):

@RequestMapping(value = "/sendEmail", method = RequestMethod.POST)
@ResponseBody
public void sendEmail(HttpServletRequest request, HttpServletResponse response) {

最后,这里是传递给我的 sendEmail 方法的 HttpServletRequest 的内容:

请求方法

POST

请求标头

Header name: host  
Header value: example.com:8080

Header name: connection  
Header value: keep-alive

Header name: content-length  
Header value: 1100

Header name: origin  
Header value: http://example.com:8080

Header name: user-agent  
Header value: Mozilla/5.0 (Linux; Android 5.0.2; HTC6500LVW Build/LRX22G; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/46.0.2490.76 Mobile Safari/537.36

Header name: content-type  
Header value: application/x-www-form-urlencoded;charset=UTF-8

Header name: accept  
Header value: */*

Header name: referer  
Header value: http://example.com:8080/myProject/callback?mode=recoverPassword&identifier=test@test.com

Header name: accept-encoding  
Header value: gzip, deflate

Header name: accept-language  
Header value: en-US

Header name: x-requested-with  
Header value: [MY APP PACKAGE NAME OMITTED]

请求参数

Parameter name: action  
Parameter value: resetPassword

Parameter name: email  
Parameter value: test@test.com

Parameter name: challenge  
Parameter value:

Parameter name: response  
Parameter value: 03AHJ_Vuued2d7eKM-hD[... CONTENTS OMITTED ...]G1mzdsuc8

请注意,请求参数“challenge”是空字符串,并且没有提及“oobCode”,正如堆栈跟踪如此恰当地指出的那样。

我在这里遗漏了什么吗?我需要在我的小部件端点中采取额外的步骤吗?我是否需要在包含我的 JavaScript 小部件的 HTML 文件中添加更多内容?任何帮助将不胜感激!

【问题讨论】:

  • 我猜这意味着响应中没有 oobCode
  • 是的,就是这个意思。问题是为什么它不存在。
  • 您是否在服务器上生成 json 响应,如果是,您可以在发送之前打印响应,这样您就可以确定它是否真的有那个对象或不是
  • 问题不在于响应,@PankajNimgade。问题在于请求进来,我无法控制。虽然从技术上讲,referer 是我后端的另一种方法,但身份工具包负责发送 POST 请求。
  • 在这种情况下,您需要确认需要哪些参数、标头和方法名称,您可以向我提出适当的请求以获得结果

标签: java android json spring-boot google-identity-toolkit


【解决方案1】:

在与在 Google 从事身份工具包工作的人交谈后,我被告知他们在身份工具包项目中存在错误配置。在他们进行一些更改后,我现在可以成功调用上述 getOobResponse(HttpServletRequest req) 方法,而无需获取堆栈跟踪!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2015-01-04
    • 2023-03-05
    • 1970-01-01
    • 2023-03-05
    • 2020-07-10
    相关资源
    最近更新 更多