我正在尝试对使用OAuth2的网站进行身份验证,并将令牌存储在我的会话对象中。我的网络应用程序最初检查是否已存在令牌,如果没有,则将用户重定向到外部站点上的登录页面,用户登录并重定向回我的应用程序。到目前为止,这很好,这是有效的。我的应用程序将我引导到外部站点(Mendeley),我在那里登录,然后它将我重定向回我期望它的应用程序中的URL。
当它重定向回我的应用时,我希望请求中有代码和状态参数,我确实看到了这些,所以我假设我在正确的轨道(如果我错了就阻止我)。那么,如果我理解正确的话,我应该将代码发布回Mendeley服务以获取我的授权令牌,这就是爆炸的地方。
URL url = new URL("https://api-oauth2.mendeley.com/oauth/token");
HttpsURLConnection connection = (HttpsURLConnection) url
.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
String authString = getClientId() + ":" + "[MY CLIENT SECRET]";
System.out.println("auth string: " + authString);
byte[] authEncBytes = Base64.getUrlEncoder().encode(
authString.getBytes());
String authStringEnc = new String(authEncBytes);
System.out.println("Base64 encoded auth string: " + authStringEnc);
connection.addRequestProperty("Authorization", "Basic "
+ authStringEnc);
connection.setDoOutput(true);
OutputStream os = connection.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(os);
writer.write("scope=all&grant_type=authorization_code");
writer.write("&client_id=");
writer.write(getClientId());
writer.write("&code=");
writer.write(code);
writer.write("&redirect_uri=");
writer.write(getMendeleyRedirectUrl(request));
writer.write("&client_secret=");
writer.write("[MY CLIENT SECRET]");
writer.flush();
writer.close();
int responseCode = connection.getResponseCode();
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
我得到的响应代码是401.在最后一行,它试图从连接中获取inputStream,它抛出一个异常,这对我来说是有意义的,它感觉它返回了401并且没有一个。
是的,redirect_uri已编码。 (我认为初始重定向到登录名不会起作用。)
我的蜘蛛侠意识告诉我,我忽略了一些对我来说应该是显而易见的事情,但我已经尝试了我能想到的一切。任何帮助将不胜感激。
编辑:更改了auth标头的添加方式,现在获取响应代码400。
答案 0 :(得分:0)
您应该检查是否正在创建正确的基本身份验证标头。它应该是这样的:
String user = "your app id";
String password = "your app secret";
String authValue = user + ":" + password;
Base64.Encoder encoder = Base64.getEncoder();
Bytes[] btyes = authValue.getBytes(StandardCharsets.UTF_8);
String authValueEncoded = encoder.encodeToString(bytes);
connection.addRequestProperty("Authorization",
"Basic "+authValueEncoded);
此用户和密码的值是Mendeley特有的。请参阅http://dev.mendeley.com/reference/topics/authorization_auth_code.html
的第4步关于错误400,您可能需要检查grant_type,code或redirect_uri。请记住,代码只能使用一次。 来自文档:
由于grant_type,code和的值不正确或缺失而导致的错误 redirect_uri导致HTTP错误请求响应,状态为 400错误请求和JSON格式错误代码和消息:
HTTP / 1.1 400错误请求内容类型:application / json 内容长度:82
{"错误":" invalid_grant"," error_description":"无效的访问代码"}
缺少值会生成带有invalid_request错误代码的响应。 无效值(包括以前使用的代码)生成响应 带有invalid_grant错误代码。指定除以外的值 authorization_code(或refresh_token)生成一个响应 unsupported_grant_type错误代码。
所以你可能想回顾一下反应主体,看看有什么不对。