【发布时间】:2016-08-11 22:42:40
【问题描述】:
我正在尝试对使用 OAuth2 的站点进行身份验证并将令牌存储在我的会话对象中。我的网络应用程序最初检查是否已经存在令牌,如果没有,它将用户重定向到外部站点上的登录页面,用户登录并被重定向回我的应用程序。到目前为止,一切都很好,这行得通。我的应用程序将我定向到外部站点 (Mendeley),我在那里登录,然后它将我重定向回我期望它访问的应用程序中的 url。
当它重定向回我的应用程序时,我希望请求中有一个 code 和一个 state 参数,我确实看到了这些,所以我假设我在正确的轨道(如果我错了就阻止我)。那么,如果我理解正确的话,我应该将 代码 发布回 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 已编码。 (我不认为初始重定向到登录会起作用。)
我的蜘蛛侠感觉告诉我,我忽略了一些对我来说应该很明显的东西,但我已经尝试了我能想到的一切。任何帮助将不胜感激。
编辑:更改了添加身份验证标头的方式,现在得到响应代码 400。
【问题讨论】:
-
请记住 Authorization Basic 应该是 "
: " 的 base64 编码,在这种情况下,用户将是 app id 和密码 app secret。