在Java中使用OAuth创建Jira连接
我正在尝试使用OAuth在Jira中建立连接,并在连接成功后在Jira中创建一个问题。我现在已经得到了访问令牌,我不知道如何通过该访问令牌连接到Jira 这是我获取令牌、令牌机密、检索到的请求令牌URL和访问令牌的代码在Java中使用OAuth创建Jira连接,java,oauth,jira,Java,Oauth,Jira,我正在尝试使用OAuth在Jira中建立连接,并在连接成功后在Jira中创建一个问题。我现在已经得到了访问令牌,我不知道如何通过该访问令牌连接到Jira 这是我获取令牌、令牌机密、检索到的请求令牌URL和访问令牌的代码 private AtlassianOAuthClient getJiraOAuthClient() { final String baseURI = "http://bmh1060149:8080"; final String consumerK
private AtlassianOAuthClient getJiraOAuthClient() {
final String baseURI = "http://bmh1060149:8080";
final String consumerKey = "hardcoded-consumer";
final String consumerPrivatekey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDFkPMZQaTqsSXI+bSI65rSVaDzic6WFA3WCZMVMi7lYXJAUdkXo4DgdfvEBO21Bno3bXIoxqS411G8S53I39yhSp7z2vcB76uQQifi0LEaklZfbTnFUXcKCyfwgKPp0tQVA+JZei6hnscbSw8qEItdc69ReZ6SK+3LHhvFUUP1nLhJDsgdPHRXSllgZzqvWAXQupGYZVANpBJuK+KAfiaVXCgA71N9xx/5XTSFi5K+e1T4HVnKAzDasAUt7Mmad+1PE+56Gpa73FLk1Ww+xaAEvss6LehjyWHM5iNswoNYzrNS2k6ZYkDnZxUlbrPDELETbz/n3YgBHGUlyrXi2PBjAgMBAAECggEAAtMctqq6meRofuQbEa4Uq5cv0uuQeZLV086VPMNX6k2nXYYODYl36T2mmNndMC5khvBYpn6Ykk/5yjBmlB2nQOMZPLFPwMZVdJ2Nhm+naJLZC0o7fje49PrN2mFsdoZeI+LHVLIrgoILpLdBAz/zTiW+RvLvMnXQU4wdp4eO6i8J/Jwh0AY8rWsAGkk1mdZDwklPZZiwR3z+DDsDwPxFs8z6cE5rWJd2c/fhAQrHwOXyrQPsGyLHTOqS3BkjtEZrKRUlfdgV76VlThwrE5pAWuO0GPyfK/XCklwcNS1a5XxCOq3uUogWRhCsqUX6pYfAVS6xzX56MGDndQVlp7U5uQKBgQDyTDwhsNTWlmr++FyYrc6liSF9NEMBNDubrfLJH1kaOp590bE8fu3BG0UlkVcueUr05e33Kx1DMSFW72lR4dht1jruWsbFp6LlT3SUtyW2kcSet3fC8gySs2r6NncsZ2XFPoxTkalKpQ1atGoBe3XIKeT8RDZtgoLztQy7/7yANQKBgQDQvSHEKS5SttoFFf4YkUh2QmNX5m7XaDlTLB/3xjnlz8NWOweK1aVysb4t2Tct/SR4ZZ/qZDBlaaj4X9h9nlxxIMoXEyX6Ilc4tyCWBXxn6HFMSa/Rrq662Vzz228cPvW2XGOQWdj7IqwKO9cXgJkI5W84YtMtYrTPLDSjhfpxNwKBgGVCoPq/iSOpN0wZhbE1KiCaP8mwlrQhHSxBtS6CkF1a1DPm97g9n6VNfUdnB1Vf0YipsxrSBOe416MaaRyUUzwMBRLqExo1pelJnIIuTG+RWeeu6zkoqUKCAxpQuttu1uRo8IJYZLTSZ9NZhNfbveyKPa2D4G9B1PJ+3rSO+ztlAoGAZNRHQEMILkpHLBfAgsuC7iUJacdUmVauAiAZXQ1yoDDo0Xl4HjcvUSTMkccQIXXbLREh2w4EVqhgR4G8yIk7bCYDmHvWZ2o5KZtD8VO7EVI1kD0z4Zx4qKcggGbp2AINnMYqDetopX7NDbB0KNUklyiEvf72tUCtyDk5QBgSrqcCgYEAnlg3ByRd/qTFz/darZi9ehT68Cq0CS7/B9YvfnF7YKTAv6J2Hd/i9jGKcc27x6IMi0vf7zrqCyTMq56omiLdu941oWfsOnwffWRBInvrUWTj6yGHOYUtg2z4xESUoFYDeWwe/vX6TugL3oXSX3Sy3KWGlJhn/OmsN2fgajHRip0=";
AtlassianOAuthClient jiraoAuthClient = new AtlassianOAuthClient(consumerKey, consumerPrivatekey, baseURI, "");
return jiraoAuthClient;
}
下面是一个获取访问令牌的方法
private String getAccessToken() {
AtlassianOAuthClient jiraoAuthClient = getJiraOAuthClient();
TokenSecretVerifierHolder requestToken = jiraoAuthClient.getRequestToken();
String authorizeUrl = jiraoAuthClient.getAuthorizeUrlForToken(requestToken.token);
String token = requestToken.token;
String tokenSecret = requestToken.secret;
System.out.println("Token is " + requestToken.token);
System.out.println("Token secret is " + requestToken.secret);
System.out.println("Retrieved request token. go to " + authorizeUrl);
URI uri = null;
try {
uri = new URI(authorizeUrl);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
try {
desktop.browse(uri);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String accessToken = jiraoAuthClient.swapRequestTokenForAccessToken(token, tokenSecret, "");
// String verifier = requestToken.verifier;
System.out.println("Access token is : " + accessToken);
return accessToken;
}
这些方法给了我很大的帮助
Token is 38ESi9IJW5u3vKDslPFtuV1ZtzDpr6zi
Token secret is cnDSL8oJyuoaQdRcFDwgHzLppSshQn9b
Retrieved request token. go to http://bmh1060149:8080/plugins/servlet/oauth/authorize?oauth_token=38ESi9IJW5u3vKDslPFtuV1ZtzDpr6zi
Access token is : 015CeJiH8cpI5R3OKpNco158kApq8YwV
现在我想用这些建立jira连接。以前我使用基本身份验证创建Jira连接,但现在我想使用Oauth创建Jira连接。下面是我使用基本身份验证建立Jira连接的代码。任何人都可以告诉我如何调整代码,或者提供任何其他方法,通过这些方法我可以使用OAuth建立Jira连接
public String jiraConnectionpost(String auth, String url, String key) throws JSONException {
System.out.println("Inside jiraConnectionpost for JiraAdapterImpl");
WebResource webResource = client.resource(url);
ClientResponse response = webResource.header("Authorization", "Basic " + auth).type("application/json")
.accept("application/json").post(ClientResponse.class, key);
int statusCode = response.getStatus();
if (statusCode == 401) {
try {
throw new AuthenticationException("Invalid Username or Password");
} catch (AuthenticationException e) {
e.printStackTrace();
}
}
String jsonString = response.getEntity(String.class);
url = null;
return jsonString;
}
经过3天的研究,我终于破解了使用OAuth在Jira中创建、更新和删除问题的解决方案。对于使用OAuth在Jira中创建操作,请将json数据作为输入流的形式传递,因为makeAuthenticatedRequest将参数作为(字符串url、字符串accessToken、InputStream bodyAsStream、字符串operationType)。更多参考请参见下面的代码
public void createJiraIssue(JiraExecutionDTO jiraEx) {
System.out.println("Inside createJiraIssue for JiraAdapterImpl");
String jiraUrl = jiraEx.getJiraUrl();
String operationType = "CREATE";
String jSonData = "Your Json data for create operation";
try {
InputStream inputStream = new ByteArrayInputStream(jSonData.getBytes("UTF-8"));
OAuthMessage response = getResponseForRequest(jiraUrl, inputStream, operationType);
System.out.println(response);
} catch (Exception e) {
e.printStackTrace();
}
}
private OAuthMessage getResponseForRequest(String url, InputStream inputstream, String operationType) {
AtlassianOAuthClientRequest jiraOauthClient = getJiraOAuthClient();
String accessToken = getAccessToken();
OAuthMessage response = null;
try {
response = jiraOauthClient.makeAuthenticatedRequest(url, accessToken, inputstream, operationType);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public OAuthMessage makeAuthenticatedRequest(String url, String accessToken, InputStream bodyAsStream,
String operationType) throws Exception {
//boolean suppressNPE = false;
String method = null;
OAuthAccessor accessor = getAccessor();
OAuthClient client = new OAuthClient(new HttpClient4());
accessor.accessToken = accessToken;
OAuthMessage request = null;
if (operationType == "CREATE") {
method = OAuthMessage.POST;
request = accessor.newRequestMessage(method, url, Collections.<Map.Entry<?, ?>> emptySet(), bodyAsStream);
} else if (operationType == "UPDATE") {
method = OAuthMessage.PUT;
request = accessor.newRequestMessage(method, url, Collections.<Map.Entry<?, ?>> emptySet(), bodyAsStream);
} else if (operationType == "DELETE") {
method = OAuthMessage.DELETE;
request = accessor.newRequestMessage(method, url, Collections.<Map.Entry<?, ?>> emptySet());
}
List<Map.Entry<String, String>> headers = request.getHeaders();
headers.add(new OAuth.Parameter(HttpMessage.CONTENT_TYPE, "application/json"));
// headers.add(new OAuth.Parameter(HttpMessage.CONTENT_LENGTH,
// contentLength));
OAuthMessage response = client.invoke(request, ParameterStyle.QUERY_STRING);
return response;
}
public void createJiraIssue(JiraExecutionDTO jiraEx){
System.out.println(“内部createJiraIssue for JiraAdapterImpl”);
字符串jiraUrl=jiraEx.getJiraUrl();
字符串操作类型=“创建”;
String jSonData=“创建操作的Json数据”;
试一试{
InputStream InputStream=新的ByteArrayInputStream(jSonData.getBytes(“UTF-8”);
OAuthMessage response=getResponseForRequest(jiraUrl、inputStream、operationType);
System.out.println(响应);
}捕获(例外e){
e、 printStackTrace();
}
}
私有OAuthMessage getResponseForRequest(字符串url、InputStream、InputStream、字符串操作类型){
AtlassianOAuthClientRequest jiraOauthClient=getJiraOAuthClient();
字符串accessToken=getAccessToken();
OAuthMessage响应=null;
试一试{
response=jiraOauthClient.makeAuthenticatedRequest(url、accessToken、inputstream、operationType);
}捕获(例外e){
e、 printStackTrace();
}
返回响应;
}
公共OAuthMessage makeAuthenticatedRequest(字符串url、字符串accessToken、InputStream bodyAsStream、,
字符串操作类型)引发异常{
//布尔suppressNPE=false;
字符串方法=null;
OAuthAccessor accessor=getAccessor();
OAuthClient=新的OAuthClient(新的HttpClient4());
accessor.accessToken=accessToken;
OAuthMessage请求=null;
如果(操作类型==“创建”){
方法=OAuthMessage.POST;
request=accessor.newRequestMessage(方法、url、集合>emptySet()、bodyAsStream);
}else if(操作类型==“删除”){
方法=OAuthMessage.DELETE;
request=accessor.newRequestMessage(方法、url、集合>emptySet());
返回响应。readBodyAsString();
}捕获(例外e){
抛出新的RuntimeException(“未能发出经过身份验证的请求。”,e);
}
}
public void getAllissueType(JiraExecutionDTO jcqcred){
System.out.println(“JiraAdapterImpl的内部getAllIssuetypeAssociatedToProject”);
字符串jiraURL=jcqcred.getJiraUrl();
如果(!jiraURL.endsWith(“/”){
jiraURL=jiraURL+“/”;
}
字符串url=jiraURL+“rest/api/2”+“/”+“issuetype”;
字符串issueTypes=getResponseForRequest(url);
System.out.println(“与项目关联的Issuetype为\n”+Issuetype);
}
有关更多参考信息,请参阅rest-oauth-client-1.0.one-jar。在java反编译器中打开此jar,并查看类AtlassianOAuthClient.class、JIRAOAuthClient.class、TokenSecretVerifierHolder.class。这将使您完全理解我是如何实现上述方法的。只需获取项目即可
几分钟后你就会有一个工作版本
对于你也可以使用它的帖子,我必须创建一个新的方法,它不在捆绑包中,但几分钟后会像一个符咒一样工作
我花了几天时间浏览了很多关于这个OAuth1.0舞蹈的东西,都是用JiraXray制作的,没有一个是现成的
所以,我奉基督的名和慷慨,献上这一切。请不要删除此项,这很重要
我一直在尝试使用oAuth创建连接。我在OAuthAccessor accessor=getAccessor()行将访问器设置为null;请告诉我JIRA存取器出了什么问题。嗨,Bindu。。。。您必须进入getAccessor()方法内部,并对其进行调试,以了解oauth连接的问题。您是如何获得这个consumerkey值的?我对JSON有问题。请看这里:
public String makeAuthenticatedRequest(String url, String accessToken) {
try {
OAuthAccessor accessor = getAccessor();
OAuthClient client = new OAuthClient(new HttpClient4());
accessor.accessToken = accessToken;
OAuthMessage response = client.invoke(accessor, url, Collections.<Map.Entry<?, ?>> emptySet());
return response.readBodyAsString();
} catch (Exception e) {
throw new RuntimeException("Failed to make an authenticated request.", e);
}
}
public void getAllIssueTypes(JiraExecutionDTO jcqcred) {
System.out.println("Inside getAllIssuetypeAssociatedToProject for JiraAdapterImpl");
String jiraURL = jcqcred.getJiraUrl();
if (!jiraURL.endsWith("/")) {
jiraURL = jiraURL + "/";
}
String url = jiraURL + "rest/api/2" + "/" + "issuetype";
String issueTypes = getResponseForRequest(url);
System.out.println("Issuetype associated to project are\n" + issueTypes);
}