2012-12-11 80 views
0

这个问题是在跟进我刚才的问题谷歌的OAuth Java客户端得到一个访问令牌失败,“400错误的请求{”错误“:” INVALID_REQUEST“}”

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

我跳入水中到JAVA API来解决在谷歌的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> 

本页面我提出了一个简单的链接“连接谷歌帐户”,这给我带来了成功,以谷歌的网页,我不得不“允许”我应用访问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提交自己谷歌的服务器我得到的是以下无益的JSON

{ 
"error": "invalid_request" 
} 

我会很感激在这一个任何帮助。 谢谢

+0

你能发布要求你发送到谷歌?一些提琴手捕获 – Vlad

回答

2

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

这里,redirect_uri参数被编码,因此它与客户端注册时使用的参数不同,导致invalid_request

根据上述JSP代码,如果redirect_uri参数是固定的,则令牌服务器响应可能导致invalid_grant,因为code也正在编码。通常情况下,谷歌发布授权码,这是不友好的网址。

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

+1

你是对的,没有编码的URI部分解决了问题。现在我得到“错误”:“redirect_uri_mismatch”!我确信http:// localhost:8080/BroadCastr/step3.jsp是在Google API Access Console中配置的 – Sap

+0

那么你是对的,我通过重新回到step2.jsp来修复最后一个问题 – Sap

相关问题