How to create a oAuth request using java? -
i need make connection viagogo website using oauth. referring documentation need create request similar following 1
using example in step 1a, means may generate signature base string looks following: get&http%3a%2f%2fapi.viagogo.net%2fpublic%2fsimpleoauthaccessrequest&oauth_consumer_key%3dtestkey%26oauth_nonce%3dmyn0nc3%26oauth_signature_method%3dhmac-sha1%26oauth_timestamp%3d1292404912%26oauth_version%3d1.0%26scope%3dapi.public i using following code when comment lines 1,2 return unauthorized error, , when use them shows oauthservice.signrequest returns void.
tradekingapi.java
import org.scribe.builder.api.defaultapi10a; import org.scribe.model.token; public class tradekingapi extends defaultapi10a { @override public string getrequesttokenendpoint() { return "http://api.viagogo.net/public/simpleoauthaccessrequest"; } @override public string getaccesstokenendpoint() { return "http://api.viagogo.net/public/simpleoauthaccessrequest"; } @override public string getauthorizationurl(token requesttoken) { return "http://api.viagogo.net/public/simpleoauthaccessrequest"; } } main.java
import org.scribe.builder.servicebuilder; import org.scribe.model.oauthrequest; import org.scribe.model.response; import org.scribe.model.token; import org.scribe.model.verb; import org.scribe.oauth.oauthservice; import api.tradekingapi; import org.scribe.builder.api.defaultapi10a; import org.scribe.model.oauthconstants; import org.scribe.oauth.oauthservice; ........ oauthservice oauthservice = new servicebuilder() .provider(tradekingapi.class) .apikey("my consumer key") .apisecret("my secret") .scope("api.public") .build(); long seconds = (system.currenttimemillis() / 1000); system.out.println(">>>" + seconds); string stseconds = seconds.tostring(); oauthrequest request = new oauthrequest(verb.get, "http://api.viagogo.net/public /simpleoauthaccessrequest"); request.addoauthparameter(oauthconstants.consumer_key, "my consumer key"); request.addoauthparameter(oauthconstants.nonce, "myn0nc3"); request.addoauthparameter(oauthconstants.sign_method, "hmac-sha1"); request.addoauthparameter(oauthconstants.timestamp, seconds.tostring()); request.addoauthparameter(oauthconstants.version, "1.0"); request.addoauthparameter("scope", "api.public"); 1 string signature = oauthservice.signrequest(oauthconstants.empty_token, request); 2 request.addoauthparameter(oauthconstants.signature,signature); response response = request.send(); system.err.println(">>" + response.issuccessful()); system.err.println(">>" + response.getmessage()); system.err.println(">>" + response.getbody());
from understand viagogo public api access documentation, token in step 1, equivalent request token in complete oauth 1.0a "dance".
so, should able use scribe-java internal classes token without doing hand. difference in scribe, request sends callback url oauth server next step of oauth "dance".
as can't consumer account can make assumption here. let's have 2 scenarios :
scenario 1 : viagogo server tolerate parameter (i.e. call url)
so can go 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 calling code :
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 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 said, if viagogo security bit strict , refuses useless param oauth_callback, you'll need switch scenario 2
scenario 2 : build own oauthservice
in scenario have create new oauthservice avoid dealing 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) { (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 different create 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 calling code 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 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 code because can't access consumer , secret key, should close need.
Comments
Post a Comment