我正在尝试使用 Python 中的 OAuth1 身份验证方法向 Tweeter 发出请求,我设法使用请求库来做到这一点,但在 Java 上我使用放心。以下代码不起作用,它返回 Unauthorized :
Response response = given()
.headers(headerEmpty())
.auth()
.oauth(twitterSettings.getApiKey(), twitterSettings.getApiKeySecret(),
twitterSettings.getAccessToken(), twitterSettings.getAccessTokenSecret())
.spec(baseUrl)
.get("users/me")
.then()
.extract().response();
我在网上查找,发现我可能需要使用 Scribejava 库,但不确定如何与 Rest Assured 结合使用,我并不懒惰,但有一些帮助。
编辑: 我添加了 Scribe 的依赖项,但仍然不起作用。
public static Headers headerEmpty() {
Header contentType = new Header("Content-Type", "application/json");
Header acceptType = new Header("Accept", "*/*");
List<Header> headerList = new ArrayList<>();
headerList.add(contentType);
headerList.add(acceptType);
return new Headers(headerList);
}
我认为问题是因为缺少标题。 尝试将此标头添加到上面的请求中:
Content-Type: application/x-www-form-urlencoded
为了准确查看您传递的标头,您可以像这样更改代码:
Response response = given()
.log().all()
.header("Content-Type", "application/x-www-form-urlencoded")
.auth()
.oauth(twitterSettings.getApiKey(), twitterSettings.getApiKeySecret(),
twitterSettings.getAccessToken(), twitterSettings.getAccessTokenSecret())
.spec(baseUrl)
.get("users/me")
.then()
.extract().response();
我在“放心”和 OAuth1 上也遇到了类似的问题。 我用这种方式解决了问题:
String oauthHeader = "OAuth oauth_consumer_key=\"" + consumerKey + "\", "
+ "oauth_token=\"" + accessToken + "\", "
+ "oauth_signature_method=\"PLAINTEXT\", "
+ "oauth_signature=\"" + consumerSecret + "%26" + accessTokenSecret + "\"";
given()
.contentType(ContentType.JSON)
.header("Authorization", oauthHeader)
.body("xyz")
.when()
.get("https://xyz")
.getBody()
.prettyPrint();
我在将 PLAINTEXT 设置为签名方法时遇到问题。