用于获取访问令牌的Google oauth java客户端失败,并显示“400 Bad Request {”error“:”invalid_request“}”

时间:2012-12-11 06:48:55

标签: java jsp rest google-oauth

这个问题跟进了我之前的问题

Google oauth java client to get an access token fails with "400 Bad Request { "error" : "invalid_request" }"

我潜入JAVA API来解决在google的oAuth API中为authToken交换代码的问题,但无法找到答案。因此,我走了一条非常简单的路线。

我创建了以下JSP

的index.jsp

<%@page import="java.net.URLEncoder"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <a href="https://accounts.google.com/o/oauth2/auth?
scope=https://gdata.youtube.com/&
redirect_uri=<%=URLEncoder.encode("http://localhost:8080/BroadCastr/step2.jsp","UTF-8")%>&
response_type=code&
client_id=X985XXXXXXXX.apps.googleusercontent.com&approval_prompt=force">Connect google account</a>
    </body>
</html>

此页面向我显示了一个简单的链接“Connect google account”,这使我成功访问了googles页面,我必须“允许”我的应用程序代表我访问youtube

在step2.jsp

<%@page import="java.net.URLEncoder"%>
<%@page import="java.util.Iterator"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

        <form id="frm" method="post" action="https://accounts.google.com/o/oauth2/token" enctype="application/x-www-form-urlencoded">
            <input type="hidden" name="code" value="<%=URLEncoder.encode(request.getParameter("code"),"UTF-8")%>"/>
            <input type="hidden" name="client_id" value="XXXXXXXXXXX.apps.googleusercontent.com"/>
            <input type="hidden" name="client_secret" value="XXXXxxxxXXXXXX"/>
            <input type="hidden" name="redirect_uri" value="<%=URLEncoder.encode("http://localhost:8080/BroadCastr/step3.jsp","UTF-8")%>"/>
            <input type="hidden" name="grant_type" value="authorization_code"/>
            <input type="hidden" name="scope" value=""/>
        </form>
    </body>
</html>
<script>
    document.getElementById("frm").submit();
</script>

但最后step2.jsp将自己提交给google的服务器,我得到的是无用的JSON

{
"error": "invalid_request"
}

我真的很感激这方面的任何帮助。 感谢

1 个答案:

答案 0 :(得分:2)

在对访问令牌端点进行POST时,不应对所需参数进行url编码(至少是google API)。

此处,redirect_uri参数已编码,因此与客户端注册时使用的参数不同,导致invalid_request

基于上述JSP代码,如果redirect_uri参数已修复,则令牌服务器响应可能会生成invalid_grant,因为code也正在编码。通常,谷歌发布授权代码,这不是网址友好的。

删除上面coderedirect_uri参数的编码应该会产生包含访问令牌的服务器响应。