How to create a oAuth request using java?

后端 未结 2 1955
温柔的废话
温柔的废话 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: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 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.

提交回复
热议问题