我需要从java应用程序访问一些使用基于令牌的身份验证的RESTful Web服务。据我了解,为此目的的最佳选择是使用基于 JAX-RS 的库,如 Jersey,但我对这个问题很陌生。也许有人可以通过提供正确请求的示例代码来帮助我从 Web 服务获取令牌。
我们拥有什么:
- 令牌颁发服务器的 URI。它使用 oAuth2 授权。
- clientId 和 clientSecret。我们必须将它们提交给令牌颁发服务器,该服务器将验证它们并返回令牌。
- Web 服务本身的 URI。
- 用于服务访问的用户名和密码。
据我了解,要获得令牌,我必须发送 POST 请求以及以下标头:
- "授权"、"基本" YWRhMGI3NTicdscsN2I0MjNjM2EwNWQ0MjM2ZTg6QU1hS0ltUEZJaUFSR3dGMmJ3NjZZVi9Ec05YZTd0ZkEerfrvegezNoND0=" ("Basic " + base64 编码 "clientId:clientSecret"(
- "Accept", "application/x-www-form-urlencoded">
- "内容类型"、"应用程序/json;odata=详细">
和以下参数:
grant_type=密码&用户名=某个用户名&密码=某个密码&范围=配置文件
希望有人能帮助我编写示例代码。
已解决!
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public void getHttpCon() throws Exception{
String POST_PARAMS = "grant_type=password&username=someusrname&password=somepswd&scope=profile";
URL obj = new URL("http://someIP/oauth/token");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json;odata=verbose");
con.setRequestProperty("Authorization",
"Basic Base64_encoded_clientId:clientSecret");
con.setRequestProperty("Accept",
"application/x-www-form-urlencoded");
// For POST only - START
con.setDoOutput(true);
OutputStream os = con.getOutputStream();
os.write(POST_PARAMS.getBytes());
os.flush();
os.close();
// For POST only - END
int responseCode = con.getResponseCode();
System.out.println("POST Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { //success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// print result
System.out.println(response.toString());
} else {
System.out.println("POST request not worked");
}
}
几点:
- 指定的 URL 请求属于资源所有者密码凭据授予。确保您处于此赠款所针对的场景下(更多详细信息 此处(.
- JAX-RS是关于实现REST API的,而不是关于客户端调用的(也许你说的是"jax-rs客户端"?如果是这样的话,就OAuth而言,它与任何其他HTTP客户端一样属于我的最后一点类别(。
- 有一些库可以处理获取访问令牌,因此你只需要提供属性并决定如何处理生成的令牌。例如,如果你可以使用spring,Spring Security OAuth2(只谈论"客户端角色"配置;你将使用外部授权服务器(。
- 如果这些库不适合您的情况:您只需实现/使用 http 客户端对该授权服务器进行标准调用(它们只是 REST API(。一些选项:apache httpcomponents,SpringRestTemplate,jdk HttpUrlConnection