OAuth2请求令牌返回401

时间:2016-08-11 12:30:30

标签: java oauth oauth2

我正在尝试对使用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。

1 个答案:

答案 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错误代码。

所以你可能想回顾一下反应主体,看看有什么不对。