带有scribe库的Box OAuth2 API上缺少grant_type参数或参数无效

时间:2013-05-30 18:50:39

标签: java oauth-2.0 jenkins-plugins box-api scribe

我正在尝试编写一个与Box集成的简单Jenkins插件,但我总是收到此错误:

=== Box's OAuth Workflow ===

Fetching the Authorization URL...
Got the Authorization URL!
Now go and authorize Scribe here:
https://www.box.com/api/oauth2/authorize?client_id=abc123&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fjenkins%2Fconfigure&response_type=code&state=authenticated
And paste the authorization code here
>>xyz9876543

Trading the Request Token for an Access Token...
Exception in thread "main" org.scribe.exceptions.OAuthException: Cannot extract an acces token. Response was: {"error":"invalid_request","error_description":"Invalid grant_type parameter or parameter missing"}
    at org.scribe.extractors.JsonTokenExtractor.extract(JsonTokenExtractor.java:23)
    at org.scribe.oauth.OAuth20ServiceImpl.getAccessToken(OAuth20ServiceImpl.java:37)
    at com.example.box.oauth2.Box2.main(Box2.java:40)

Box2类(用于测试):

public class Box2 {
    private static final Token EMPTY_TOKEN = null;

    public static void main(String[] args) {
        // Replace these with your own api key and secret
        String apiKey = "abc123";
        String apiSecret = "xyz987";
        OAuthService service = new ServiceBuilder().provider(BoxApi.class)
                .apiKey(apiKey).apiSecret(apiSecret)
                .callback("http://localhost:8080/jenkins/configure")
                .build();
        Scanner in = new Scanner(System.in);

        System.out.println("=== Box's OAuth Workflow ===");
        System.out.println();

        // Obtain the Authorization URL
        System.out.println("Fetching the Authorization URL...");
        String authorizationUrl = service.getAuthorizationUrl(EMPTY_TOKEN);
        System.out.println("Got the Authorization URL!");
        System.out.println("Now go and authorize Scribe here:");
        System.out.println(authorizationUrl);
        System.out.println("And paste the authorization code here");
        System.out.print(">>");
        Verifier verifier = new Verifier(in.nextLine());
        System.out.println();

        // Trade the Request Token and Verfier for the Access Token
        System.out.println("Trading the Request Token for an Access Token...");
        Token accessToken = service.getAccessToken(EMPTY_TOKEN, verifier);
        System.out.println("Got the Access Token!");
        System.out.println("(if your curious it looks like this: "
                + accessToken + " )");
        System.out.println();


    }
}

BoxApi类:

public class BoxApi extends DefaultApi20 {
    private static final String AUTHORIZATION_URL =
            "https://www.box.com/api/oauth2/authorize?client_id=%s&redirect_uri=%s&response_type=code&state=authenticated";

    @Override
    public String getAccessTokenEndpoint() {
        return "https://www.box.com/api/oauth2/token?grant_type=authorization_code";        
    }


    @Override
    public String getAuthorizationUrl(OAuthConfig config) {
        return String.format(AUTHORIZATION_URL, config.getApiKey(),
                OAuthEncoder.encode(config.getCallback()));
    }

    @Override
    public Verb getAccessTokenVerb(){
       return Verb.POST;
    }

    @Override
    public AccessTokenExtractor getAccessTokenExtractor() {
        return new JsonTokenExtractor();
    }
}

我不确定我是如何得到这些例外的。任何知道Box API的人都可以告诉我,我是否做错了吗?

1 个答案:

答案 0 :(得分:1)

访问令牌的请求需要采用POST请求的形式,请求正文中包含参数 - 看起来您正在发送带参数作为URL参数的GET。