尝试访问API时,我正在努力从Google提取请求令牌。我正在收到标准的400回复。我发送的请求几乎与他们提供的OAuth运动场中生成的请求相同。
我正在使用匿名机密/密钥,并构造了如下的基本字符串:
GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dhttp%253A%252F%252Fgooglecodesamples.com%252Foauth_playground%252Findex.php%26oauth_consumer_key%3Danonymous%26oauth_nonce%3D61dddc084c4e8adfa13d1509161939b0%26oauth_signature_method%3DHMAC- SHA1%26oauth_timestamp%3D1302853379%26oauth_version%3D1.0%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fcalendar%252Ffeeds%252F
为了调试发送的请求,我在eclipse中设置了TCP / IP监视。但是,这仅监视Http流量,因此,以下内容反映了所请求的内容的99%。
GET /accounts/OAuthGetRequestToken?scope=http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2F HTTP/1.1
Authorization: OAuth oauth_callback="http%3A%2F%2Fgooglecodesamples.com%2Foauth_playground%2Findex.php", oauth_consumer_key="anonymous", oauth_nonce="8cc04c7633db041dd0fd8e5fd0eb728e", oauth_signature="epRa5IZOA6s%2B3qhZa%2FUxuwYKnJA%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1302790583", oauth_version="1.0"
Accept: */*
User-Agent: Java/1.6.0_24
Host: localhost
Connection: keep-alive
你能告诉我我做错了什么吗?提前致谢。
下面是我为此使用的唯一代码。
package com.pdw.gb;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.google.gdata.util.common.util.Base64;
public class OAuthTest3 {
public static String read(String url)
{
StringBuffer buffer = new StringBuffer();
try
{
String[][] data = {
{ "oauth_callback", URLEncoder.encode("http://googlecodesamples.com/oauth_playground/index.php","UTF-8") },
{ "oauth_consumer_key", "anonymous" },
{ "oauth_nonce", a64BitRandomString() },
{ "oauth_signature_method", "HMAC-SHA1" },
{ "oauth_timestamp", timeSinceEpochInMillis() },
{ "oauth_signature", "" },
{ "oauth_version", "1.0" },
{ "scope", URLEncoder.encode("https://www.google.com/calendar/feeds/","UTF-8") }
};
/**
* Generation of the signature base string
*/
String signature_base_string = "GET&"
+ URLEncoder.encode(url, "UTF-8") + "&";
for (int i = 0; i < data.length; i++)
{
// ignore the empty oauth_signature field
if (i != 5)
{
System.out.print(i);
signature_base_string += URLEncoder.encode(data[i][0],
"UTF-8")
+ "%3D"
+ URLEncoder.encode(data[i][1], "UTF-8") + "%26";
}
}
// cut the last appended %26
signature_base_string = signature_base_string.substring(0,
signature_base_string.length() - 3);
/**
* Sign the request
*/
Mac m = Mac.getInstance("HmacSHA1");
m.init(new SecretKeySpec("anonymous".getBytes(), "HmacSHA1"));
m.update(signature_base_string.getBytes());
byte[] res = m.doFinal();
String sig = URLEncoder.encode(String.valueOf(Base64.encode(res)),"UTF8");
data[5][1] = sig;
/**
* Create the header for the request
*/
String header = "OAuth ";
int i=0;
for (String[] item : data)
{
if (i!=7)
{
header += item[0] + "=\"" + item[1] + "\", ";
}
i++;
}
// cut off last appended comma
header = header.substring(0, header.length() - 2);
System.out.println("Signature Base String: "
+ signature_base_string);
System.out.println("Authorization Header: " + header);
System.out.println("Signature: " + sig);
String charset = "UTF-8";
URLConnection connection = new URL(url+"?scope="+URLEncoder.encode("https://www.google.com/calendar/feeds/", "UTF-8")).openConnection();
connection.setRequestProperty("Authorization", header);
connection.setRequestProperty("Accept", "*/*");
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String read;
while ((read = reader.readLine()) != null)
{
buffer.append(read);
}
} catch (Exception e) {
e.printStackTrace();
}
return buffer.toString();
}
public static void main(String[] args)
{
boolean debug=false;
if (!debug)
{
System.out.println(OAuthTest3
.read("https://www.google.com/accounts/OAuthGetRequestToken"));
}
else
{
System.out.println(OAuthTest3
.read("http://localhost/accounts/OAuthGetRequestToken"));
}
}
private static String a64BitRandomString() {
StringBuffer sb = new StringBuffer();
Random generator = new Random();
for (int i = 0; i < 32; i++) {
Integer r = generator.nextInt();
if (r < 0) {
r = r * -1;
}
r = r % 16;
sb.append(r.toHexString(r));
}
return sb.toString();
}
private static String timeSinceEpochInMillis() {
Calendar c = Calendar.getInstance();
Date date = c.getTime();
Long time = date.getTime();
Integer i = (int) (time/1000);
return i.toString();
}
}
应该为m.init(new SecretKeySpec("anonymous&".getBytes(), "HmacSHA1"));
oauth_token_secret为空时,您仍然需要将两个秘密连接在一起的“&”来构成完整的签名密钥。
以下是我发送的更详细的数据(当然是经过审查的) 我明白这里的问题和我的非常相似,但所有提供的解决方案要么不工作(url编码),要么不适用(其他一切)。 我正在使用这份官方文件作为参考。 这可能非常明显,就像我在这里问的大多数问题一样。 编辑-我试过了 ...它返回了400。带或不带URL编码。
我正在使用Spring Security和Oauth 2.0身份验证协议保护REST服务。 我已经实现了一个MVC Spring应用程序,并且运行良好。客户端通过提供客户端凭证(client_id)向服务器请求AccessToken 如果凭据有效,客户端将获得访问令牌作为响应,如下所示: 我希望得到一个包含如下用户详细信息的响应: 有谁知道实现这种方法的方法? 我一直在谷歌上搜索很多,但我还没有找
试图让OAuth2谷歌登录工作,这是我的应用程序发出的原始请求: : : : : 这是回应: 状态: null 对此的帮助将不胜感激。我试图在我的应用程序中设置OAuth2支持的“用X登录”功能,已经让脸书和推特没有问题地工作,也想让谷歌工作,但如果我不能解决这个问题,我恐怕我将不得不放弃谷歌Auth。
问题内容: 尝试在SafariViewController中使用Facebook OAuth。首先,我使用SafariViewController打开authURL,如果用户在Safari上登录Facebook,它将重定向它们并返回带有该特定服务令牌的OAuth URL,例如Instagram 响应:https : //www.facebook.com/connect/login_success.
web应用程序如何将用户重定向到Google进行身份验证,并在Google的OAuth 2.0endpoint的URL参数中包含已签名的请求? 例如,如何将以下明文请求转换为已签名和加密的请求? https://accounts.google.com/o/oauth2/auth?client_id=424911365001.apps.googleusercontent.com
问题内容: 我正在尝试使用OAuth 2.0访问Google的文档列表API 3.0,但是遇到401错误的麻烦。 用户接受后,我的代码如下: 然后,在最后一行-getFeed()-引发异常: 这是怎么回事?在静态主测试类上,它的工作原理很吸引人,但是当我在服务器上运行它时,此行不再起作用。任何想法? 解决了 需要使用GoogleOAuthHelper而不是直接使用GoogleOAuthParame