OKAPI OAuth

Hier geht es um die Programmierung von Opencaching.de - User mit Erfahrungen im Bereich PHP, MySQL, HTML, JavaScript, CSS werden hier ständig gesucht
Antworten
arminus

Hi,

ich hab eben mal ein paar Tests mit OKAPI OAuth gemacht ... Muss dazu sagen, der OAuth Code den ich vor einiger Zeit für geocaching.com geschrieben habe läuft stabil, aber das war damals ein ziemliches Gedaddel und ich bin bei weitem kein OAuth Spezialist ... Jedenfalls ist mir die Sequenz des "3-legged dance" eigentlich klar, also habe ich mal per copy&paste&modify das Ganze für OKAPI versucht.

Ergebnis:

Der erste Call an http://www.opencaching.de/okapi/services/oauth/request_token liefert eine vernünftig erscheinende URL zurück:

Code: Alles auswählen

http://www.opencaching.de/okapi/services/oauth/request_token?oauth_token=XXXXXXXXXXXXX
wenn ich diese dann aber abschicke, bekomm ich das hier:

Code: Alles auswählen

This method requires OAuth signature (Level 2 Authentication). You didn't sign your request.
Nach meinem Verständnis ist der erste Request aber signiert und der zweite Request (mit dem oauth_token aus dem response des ersten requests) findet im Browser des Users statt (sprich kann nicht signiert werden weil ich zu dem Zeitpunkt ja noch gar nicht autorisiert habe ?). Dieser request sollte eigentlich einen redirect auf eine opencaching authorization page durchführen.  Jedenfalls läuft's bei gc.com so.

Hat irgendjemand eine Ahnung was hier schief laufen könnte ? Oder gibt es irgendwo eine Java Implementierung für OKAPI/OAuth ? (für gc.com verwende ich oauth-signpost)

Danke,
Armin
Benutzeravatar
ra_sch
Micro
Micro
Beiträge: 273
Registriert: 07.10.2012, 21:06

Ich bau das gerade für c:geo und habe es am WE zum laufen bekommen. Wenn ich den aktuellen Stand heute abend pushe, kannst du ihn dir gerne anschauen (Apache license). Ich poste hier dann noch mal die Url

Gruß

ra_sch
Benutzeravatar
ra_sch
Micro
Micro
Beiträge: 273
Registriert: 07.10.2012, 21:06

So, jetzt habe ich meinen aktuell Stand mal hochgeschickt: https://github.com/rsudev/c-geo-opensou ... e68c3cdb68
Am interessantesten dürfte main/src/cgeo/geocaching/network/OAuth.java und main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java sein.
Falls sich Fragen ergeben, stehe ich gerne zur Verfügung.

HTH

ra_sch
arminus

Danke nochmal für den Code-Einblick, in der Tat tut es bei mir nun auch mit der signpost OAuth Implementierung. Mein Problem war, dass gc.com scheinbar für request, authorize und access die gleiche URL verwendet (und ich das unbesehen kopiert hatte) während es hier 3 gibt. Etwas verkürzt sieht das Ganze dann mit Signpost so aus:

Step 1:

Code: Alles auswählen

HttpSession session = request.getSession();

DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient.getCredentialsProvider().clear();
HttpClientParams.setRedirecting(httpClient.getParams(), false);
HttpClientParams.setAuthenticating(httpClient.getParams(), false);

CommonsHttpOAuthConsumer oAuthConsumer = new CommonsHttpOAuthConsumer(GCUtils.OC_KEY, GCUtils.OC_SECRET); 
CommonsHttpOAuthProvider oAuthProvider = new CommonsHttpOAuthProvider(
		"http://www.opencaching.de/okapi/services/oauth/request_token", 
		"http://www.opencaching.de/okapi/services/oauth/access_token", 
		"http://www.opencaching.de/okapi/services/oauth/authorize");
oAuthProvider.setHttpClient(httpClient);
oAuthProvider.setOAuth10a(true);

// step 1 get request token
String requestUrl = "";
try {
	requestUrl = oAuthProvider.retrieveRequestToken(oAuthConsumer, OAUTH_CALLBACK);
} catch (Exception e) {
	logger.error(CommonUtils.stackToString(e));
        response.setStatus(401);
        return;
}

// save requestTokenValue and requestTokenSecret in session for Step2
session.setAttribute("requestTokenValue", oAuthConsumer.getToken());
session.setAttribute("requestTokenSecret", oAuthConsumer.getTokenSecret());

response.setStatus(200);
response.setContentType("text/html; charset=utf-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.println("<a href='" + requestUrl + "'>" + requestUrl + "</a>");
logger.info("Requesting OC authorization for " + email);
Step2 (in meinem Fall das Servlet das den OAUTH_CALLBACK implementiert):

Code: Alles auswählen

HttpSession session = request.getSession();
String requestTokenSecret = (String) session.getAttribute("requestTokenSecret");

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpClientParams.setRedirecting(httpClient.getParams(), false);
HttpClientParams.setAuthenticating(httpClient.getParams(), false);

OAuthConsumer oauthConsumer = new DefaultOAuthConsumer(GCUtils.OC_KEY, GCUtils.OC_SECRET); 
oauthConsumer.setTokenWithSecret(requestTokenValue, requestTokenSecret);

CommonsHttpOAuthProvider oauthProvider = new CommonsHttpOAuthProvider(
		"http://www.opencaching.de/okapi/services/oauth/request_token", 
		"http://www.opencaching.de/okapi/services/oauth/access_token", 
		"http://www.opencaching.de/okapi/services/oauth/authorize");
oauthProvider.setOAuth10a(true);

String accessTokenValue = "";
try {
	oauthProvider.retrieveAccessToken(oauthConsumer, verifierValue);
	accessTokenValue = oauthConsumer.getToken();
} catch (Exception e) {
...
}
accessTokenValue ist dann der access token.

Gruß,
Armin
arminus

Ach ja, mir ist aufgefallen (oder ich bin nur Blind), dass http://www.opencaching.de/okapi/apps/ nur einmal während der Bestätigungs-Sequenz als URL auftaucht aber ansonsten nicht vom User-Profil oder woanders verlinkt ist ... ? (das Erste mal zu schnell weg geklickt und dann nicht mehr gefunden um revoken zu können).
following

Jetzt wo du's sagst - die Seite hatte ich auch schon gesucht. Hab sie jetzt auf die Schnelle mal unten an das Benutzerprofil-Menü angehängt.
Antworten