2013-11-26 59 views
3

我试图在Apache Oltu中使用OAuthClientRequest实现OAuth客户端。而且它似乎是根据规范在消息正文中发送客户端凭证,而不是在基本身份验证标头中。我不确定,我可能错过了代码中的一些东西。客户端凭证授予类型未正确使用Apache Oltu客户端库发送?

代码

OAuthClientRequest.tokenLocation("http://localhost:8081/token") 
       .setGrantType(GrantType.CLIENT_CREDENTIALS) 
       .setClientId(clientKey) 
       .setClientSecret(clientSecret) 
       .buildBodyMessage(); 

请求

POST /令牌HTTP/1.1 内容类型:应用/ X WWW的窗体-urlencoded 缓存控制:无缓存 附注: no-cache User-Agent:Java/1.6.0_29 Host:127.0.0.1:8081 Accept:text/html,image/gif,image/jpeg,*; q = .2,/; Q = 0.2 连接:保持活跃 的Content-Length:127

client_secret = f921854d-f70b-4180-9fdd-3a3cc & grant_type = client_credentials &的client_id = 3f3b4092-7576-4b26-8135-980db7864c2

回答

2

您可能需要更改buildBodyMessage()buildQueryMessage()

1

OAuth2 Bearer Token specification定义发送承载接入令牌的三种方法:

  • 授权请求头字段
  • 表单编码机体参数
  • URI查询参数

方法buildBodyMessage()将创建一个表单编码机体参数的请求。您需要使用buildHeaderMessage(),这也是规范推荐的方法。

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(); 
} 

}

相关问题