How to create a oAuth request using java?

后端 未结 2 1956
温柔的废话
温柔的废话 2021-02-03 12:07

I need to make a connection with Viagogo website using oAuth. Referring to their documentation I need to create a request similar to the following one

Using the         


        
相关标签:
2条回答
  • 2021-02-03 12:23

    I'm assuming you're trying to get the access token (e.g you're calling SimpleOAuthAccessRequest). Scribe's OauthService has methods to handle this.

    BUT ... if you're going to do it manually, here is what's wrong with your code - at least with what you've listed here. I'm assuming you've configured scribe correctly.

    • don't pass the consumer secret with your request, that is only for signing the request
    • you should use addOauthParameter vs addQueryStringParameter
    • you should use the Scribe constants
    • you need to sign the request (again, Scribe's OauthService has help method for signing request)

    Here's your updated snippet of code.

    UPDATE: Have Scribe provide all the Oauth parameters for you

    OAuthRequest request = new OAuthRequest(Verb.GET, ...
    //since you're just passing Oauth parameters and nothing else, 
    //you can use signRequest will create Oauth Parameters for you
    service.signRequest(OAuthConstants.EMPTY_TOKEN, request)
    Response response = request.send()
    
    0 讨论(0)
  • 2021-02-03 12:31

    From what I understand from Viagogo public API access documentation, the token you get in the step 1, is the equivalent to a request token in a complete OAuth 1.0a "dance".

    So, you should be able to use scribe-java internal classes to get this token without doing it by hand. The only difference is that in scribe, this request sends also a callback url to the OAuth server for the next step of OAuth "dance".

    As I can't get a consumer account I can only make assumption here. So let's have 2 scenarios :

    Scenario 1 : Viagogo server tolerate extra parameter (i.e. call back URL)

    so you can go with this code

    import org.scribe.builder.api.DefaultApi10a;
    import org.scribe.model.Token;
    
    public class TradeKingAPI extends DefaultApi10a {
    
        @Override
        public Verb getRequestTokenVerb()
        {
          return Verb.GET;
        }
    
        @Override
        public String getRequestTokenEndpoint() {
            return "http://api.viagogo.net/Public/SimpleOAuthAccessRequest";
        }
    
        @Override
        public String getAccessTokenEndpoint() {
            return "none";
        }
    
        @Override
        public String getAuthorizationUrl(Token requestToken) {
            return "none";
        }
    }
    

    Then your calling code will be :

    OAuthService service = new ServiceBuilder()
                                .provider(TradeKingAPI.class)
                                .signatureType(QueryString)
                                .apiKey("My consumer key")
                                .apiSecret("My secret")
                                .scope("API.Public")
                                .build();
    
    Token requestToken = service.getRequestToken();
    
    //make your API calls
    
    OAuthRequest request = new OAuthRequest(Verb.GET,
                           "http://api.viagogo.net/Public/Event/235");
    service.signRequest(requestToken, request);
    Response response = request.send();
    System.out.println(response.getBody());
    

    But as I said, if Viagogo security is a bit strict and it refuses the useless param oauth_callback, you'll need to switch to scenario 2

    Scenario 2 : Build your own OAuthService

    In this scenario you have to create a new OAuthService to avoid dealing with OAuthCallback parameter.

    import org.scribe.builder.api.DefaultApi10a;
    import org.scribe.model.*;
    import org.scribe.oauth.OAuth10aServiceImpl;
    
    import java.util.Map;
    
    public class OAuth10aServiceForViagogo extends OAuth10aServiceImpl {
    
        private OAuthConfig config;
        private DefaultApi10a api;
    
        public OAuth10aServiceForViagogo(DefaultApi10a api, OAuthConfig config) {
            super(api, config);
    
            this.api = api;
            this.config = config;
        }
    
        private void addOAuthParams(OAuthRequest request, Token token) {
            request.addOAuthParameter(OAuthConstants.TIMESTAMP, api.getTimestampService().getTimestampInSeconds());
            request.addOAuthParameter(OAuthConstants.NONCE, api.getTimestampService().getNonce());
            request.addOAuthParameter(OAuthConstants.CONSUMER_KEY, config.getApiKey());
            request.addOAuthParameter(OAuthConstants.SIGN_METHOD, api.getSignatureService().getSignatureMethod());
            request.addOAuthParameter(OAuthConstants.VERSION, getVersion());
            request.addOAuthParameter(OAuthConstants.SCOPE, config.getScope());
            request.addOAuthParameter(OAuthConstants.SIGNATURE, getSignature(request, token));
    
        }
    
        private String getSignature(OAuthRequest request, Token token) {
    
            String baseString = api.getBaseStringExtractor().extract(request);
            String signature = api.getSignatureService().getSignature(baseString, config.getApiSecret(), token.getSecret());
    
            return signature;
        }
    
        private void appendSignature(OAuthRequest request) {
            for (Map.Entry<String, String> entry : request.getOauthParameters().entrySet()) {
                request.addQuerystringParameter(entry.getKey(), entry.getValue());
            }
        }
    
        @Override
        public Token getRequestToken(RequestTuner tuner) {
            OAuthRequest request = new OAuthRequest(api.getRequestTokenVerb(), api.getRequestTokenEndpoint());
    
            addOAuthParams(request, OAuthConstants.EMPTY_TOKEN);
            appendSignature(request);
    
            Response response = request.send(tuner);
            String body = response.getBody();
    
            return api.getRequestTokenExtractor().extract(body);
        }
    }
    

    TrakingApi class will be slightly different to create the an OAuth10aServiceForViagogo when calling createService :

    import org.scribe.builder.api.DefaultApi10a;
    import org.scribe.model.Token;
    
    public class TradeKingAPI extends DefaultApi10a {
    
        @override
        public OAuthService createService(OAuthConfig config)
        {
          return new OAuth10aServiceForViagogo(this, config);
        }
    
        @Override
        public Verb getRequestTokenVerb()
        {
          return Verb.GET;
        }
    
        @Override
        public String getRequestTokenEndpoint() {
            return "http://api.viagogo.net/Public/SimpleOAuthAccessRequest";
        }
    
        @Override
        public String getAccessTokenEndpoint() {
            return "none";
        }
    
        @Override
        public String getAuthorizationUrl(Token requestToken) {
            return "none";
        }
    }
    

    Then your calling code will be the same :

        OAuthService service = new ServiceBuilder()
                                    .provider(TradeKingAPI.class)
                                    .signatureType(QueryString)
                                    .apiKey("My consumer key")
                                    .apiSecret("My secret")
                                    .scope("API.Public")
                                    .build();
    
        Token requestToken = service.getRequestToken();
    
        //make your API calls
    
        OAuthRequest request = new OAuthRequest(Verb.GET,
                               "http://api.viagogo.net/Public/Event/235");
        service.signRequest(requestToken, request);
        Response response = request.send();
        System.out.println(response.getBody());
    

    I didn't test all this code because I can't access consumer and secret key, but it should be close to what you need.

    0 讨论(0)
提交回复
热议问题