我尝试在Apache Oltu中使用OAuthClientRequest实现OAuth客户端。并且它似乎是根据规范在消息正文中而不是在Basic Auth头中发送客户端凭据。我不确定,我可能在代码中遗漏了一些东西。
代码
OAuthClientRequest.tokenLocation("http://localhost:8081/token")
.setGrantType(GrantType.CLIENT_CREDENTIALS)
.setClientId(clientKey)
.setClientSecret(clientSecret)
.buildBodyMessage();
请求
POST /令牌HTTP / 1.1 内容类型:application / x-www-form-urlencoded 缓存控制:无缓存 Pragma:没有缓存 用户代理:Java / 1.6.0_29 主持人:127.0.0.1:8081 接受:text / html,image / gif,image / jpeg,*; q = .2, / ; Q = 0.2 连接:保持活力 内容长度:127
client_secret = f921854d-f70b-4180-9fdd-3a55032103cc&安培; grant_type = client_credentials&安培; CLIENT_ID = 3f3b4092-7576-4b26-8135-980db7864c2
答案 0 :(得分:2)
您可能希望使用buildBodyMessage()
buildQueryMessage()
答案 1 :(得分:1)
OAuth2 Bearer Token specification定义了三种发送承载访问令牌的方法:
方法buildBodyMessage()
将使用Form-Encoded Body Parameter创建请求。您需要使用buildHeaderMessage()
代替,这也是规范推荐的方法。
答案 2 :(得分:0)
最近,我试图找到一个OAuth2 java库来获取“client_credential”类型的accesstoken。以下是我对Apache Oltu的看法,似乎它正在发挥作用。
@Test
public void getAccessTokenViaApacheOltuOAuthClient() {
try{
OAuthClient client = new OAuthClient(new URLConnectionClient());
OAuthClientRequest request =
OAuthClientRequest.tokenLocation(TOKEN_REQUEST_URL)
.setGrantType(GrantType.CLIENT_CREDENTIALS)
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setScope(StringUtils.join(TEST_SCOPES, " ")) //if you have scope
.buildBodyMessage();
String token =
client.accessToken(request, "POST", OAuthJSONAccessTokenResponse.class)
.getAccessToken();
System.out.println(token);
assertTrue( token != null);
} catch (Exception e) {
e.printStackTrace();
}
}