Autor Thema: OKAPI OAuth  (Gelesen 1590 mal)

Offline arminus

  • Nano
  • **
  • Beiträge: 83
OKAPI OAuth
« am: 30. April 2013, 17:29:59 »
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:
http://www.opencaching.de/okapi/services/oauth/request_token?oauth_token=XXXXXXXXXXXXXwenn ich diese dann aber abschicke, bekomm ich das hier:
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

Offline ra_sch

  • Micro
  • ***
  • Beiträge: 273
Re: OKAPI OAuth
« Antwort #1 am: 30. April 2013, 18:36:32 »
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



Offline arminus

  • Nano
  • **
  • Beiträge: 83
Re: OKAPI OAuth
« Antwort #2 am: 30. April 2013, 18:53:57 »
Super, danke !

Offline ra_sch

  • Micro
  • ***
  • Beiträge: 273
Re: OKAPI OAuth
« Antwort #3 am: 30. April 2013, 22:39:10 »
So, jetzt habe ich meinen aktuell Stand mal hochgeschickt: https://github.com/rsudev/c-geo-opensource/commit/913046d56d82c0d9d3420fd4c94633e68c3cdb68
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

Offline arminus

  • Nano
  • **
  • Beiträge: 83
Re: OKAPI OAuth
« Antwort #4 am: 02. Mai 2013, 19:40:35 »
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:
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):

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

Offline arminus

  • Nano
  • **
  • Beiträge: 83
Re: OKAPI OAuth
« Antwort #5 am: 02. Mai 2013, 19:45:19 »
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

  • Gast
Re: OKAPI OAuth
« Antwort #6 am: 03. Mai 2013, 01:14:32 »
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.