正如标题所述,我想从本地Java应用程序访问bitbucket API。Bitbucket要求应用程序使用OAuth2,为此,我发现Oltu应该完成这项工作。
然而,我对OAuth的了解非常有限,因此我还停留在一个非常早期的阶段。以下是我迄今所做的工作:
步骤1:使用Bitbucket帐户注册了一个OAuth消费者,详细信息如下:
Name: jerseytestapp
Description:
CallbackURL: http://localhost:8080/
URL: 问题1:可以自动执行这一步骤吗?
步骤2:我运行了以下代码:
package jerseytest;
import org.apache.oltu.oauth2.client.request.OAuthClientRequest;
import org.apache.oltu.oauth2.common.exception.OAuthSystemException;
public class BitbucketJersey {
public static void main(String[] args) {
OAuthClientRequest request;
try {
request = OAuthClientRequest
.authorizationLocation("https://bitbucket.org/site/oauth2/authorize")
.setClientId("jerseytestapp")
.setRedirectURI("http://localhost:8080")
.buildQueryMessage();
System.out.println(request.getLocationUri());
} catch (OAuthSystemException e) {
e.printStackTrace();
}
}
}步骤3:我收到了下面的locationURI并在火狐中打开
https://bitbucket.org/site/oauth2/authorize?redirect_uri=http%3A%2F%2Flocalhost%3A8080&client_id=jerseytestapp问题2:我需要使用浏览器还是可以在java应用程序中这样做?
我在Firefox中收到以下答复消息:
Invalid client_id
This integration is misconfigured. Contact the vendor for assistance.问题3:下一步正确的步骤是什么,以及我的方法有什么问题?
发布于 2015-07-06 06:32:24
答案1:您可以自动创建OAuth使用者,但您可能不想这样做。
Bitbucket提供了关于如何通过API创建消费者的文档,尽管文档中缺少许多相关字段。即便如此,您仍然可以以编程的方式创建一个HTTP请求,该请求模仿Bitbucket的web界面为创建消费者所做的一切。所以是的,它可以是自动化的。
这就是你可能不想去的原因。在您的示例中,您有三种需要协同工作的内容:应用程序、最终用户和Bitbucket。(或者用OAuth术语来表示这个流,它们分别是客户端、资源所有者和授权服务器。)通常的处理方法是,您的应用程序由您在帐户中创建的OAuth使用者唯一标识,应用程序使用Bitbucket的所有用法都将使用该OAuth使用者来标识您的应用程序。因此,除非您正在开发一个生成其他Bitbucket应用程序的Bitbucket应用程序,否则您不需要自动化其他OAuth使用者的创建。
答案2:您可以直接从应用程序授权
Bitbucket声明它支持所有四种赠款流/类型。在RFC-6749中定义。您的代码目前正在尝试使用授权代码授予类型。使用此授予类型将迫使您使用浏览器。但是对于桌面应用程序来说,这并不是唯一的问题。如果没有可指向的公共URL服务器,您将不得不在回调URL中使用localhost,就像您已经在做的那样。这是一个很大的安全漏洞,因为恶意软件可以拦截回调URL的流量,以获得对最终用户只授予应用程序的令牌的访问权。(有关该主题的更多讨论,请参见这个堆叠溢出问题上的评论。)相反,您应该使用资源所有者密码凭据授予类型,这将允许您在应用程序中直接验证Bitbucket的用户名和密码,而不需要外部浏览器或回调URL。Bitbucket提供了一个示例curl命令,说明如何使用该授予类型这里。
答案3:正确的下一步是按照下面的示例对代码进行建模。您的方法的错误之处在于您试图使用一种不适合您的需要的授予类型,并且试图使用您的OAuth使用者的名称来标识您的应用程序,而不是您的消费者的密钥和秘密。
下面的代码示例使用我自己的用户名/密码/密钥/秘密组合成功地检索了一个访问令牌,其值已被替换。使用JDK 1.8.0_45和org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:1.0.0.对代码进行了测试。
OAuthClientRequest request = OAuthClientRequest
.tokenLocation("https://bitbucket.org/site/oauth2/access_token")
.setGrantType(GrantType.PASSWORD)
.setUsername("someUsernameEnteredByEndUser")
.setPassword("somePasswordEnteredByEndUser")
.buildBodyMessage();
String key = "yourConsumerKey";
String secret = "yourConsumerSecret";
byte[] unencodedConsumerAuth = (key + ":" + secret).getBytes(StandardCharsets.UTF_8);
byte[] encodedConsumerAuth = Base64.getEncoder().encode(unencodedConsumerAuth);
request.setHeader("Authorization", "Basic " + new String(encodedConsumerAuth, StandardCharsets.UTF_8));
OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
OAuthResourceResponse response = oAuthClient.resource(request, OAuth.HttpMethod.POST, OAuthResourceResponse.class);
System.out.println("response body: " + response.getBody());发布于 2015-07-07 16:52:23
您的主要问题是,您给出的是客户名称,而不是客户id:
.setClientId("jerseytestapp")获得我所知道的客户端id的唯一方法是查询:/consumers
然而,即使在那时,它仍然不起作用,所以我联系了bitbucket支持。事实证明,这些文件具有误导性。实际上,您需要使用客户端密钥。
.setClientId("ydrqABCD123QWER4567") // or whatever your case might behttps://stackoverflow.com/questions/31098096
复制相似问题