26 september, 2011

Verify Facebook Signed Request in Java


I'm writing this post after some frustration using Facebook's Registration social plugin. The plugin is great, no issues at all, the problem is in the verification of the 'signed_request'-query parameter in the response from Facebook. The documentation is not very clarifying and the only code-example is in PHP and there are som differences.

Some pointers:
  • The signed_request is encoded using Base64Url-encoding, not plain Base64-encoding.
  • The signed_request contains two parts (divided by a '.'), the first is the signature and the other is the JSON-payload.
  • The signature must be verified
The Java-code to verify the signature looks like this

public static boolean verifySignedRequest(String signedRequest, String appSecret){
        try {
            String[] split = signedRequest.split("\\.");

            Base64 base64 = new Base64(true); // URL-mode
            String encodedSignature = split[0];
            String encodedPayload = split[1];

            String SIGN_ALGORITHM = "HMACSHA256";
            Mac mac = Mac.getInstance(SIGN_ALGORITHM);
            SecretKeySpec secretKeySpec = new SecretKeySpec(appSecret.getBytes(), mac.getAlgorithm());
            mac.init(secretKeySpec);
            byte[] mysig = mac.doFinal(encodedPayload.getBytes());

            return Arrays.equals(mysig, base64.decode(encodedSignature));
        } catch (InvalidKeyException e) {
            // Ignore
        } catch (NoSuchAlgorithmException e) {
            // Ignore
        }
        return false;
    }

Some comments about the code:

  • The Base64 class is the Jakarta Commons Base64 implementation, in urlSafe-mode
  • 'mysig' is generated using the Facebook App Secret for your Facebook Application and the Base64Url-encoded JSON-payload, NOT the decoded version (as I thought...)
  • It should work :-)
Hope this helps!

24 september, 2011

Geektool 1337

-It´s hipp to be geek


Visst är det så! Det finns ett program på AppStore (sorry, bara för mac-geeks) som heter Geektool som garanterat kan hjälpa dig på vägen om du känner för att samla på dig lite geek-poäng.

Geektool kan bl.a. köra kommandon (Terminalen) och visa resultatet på desktopen, visa innehållet i en fil (typiskt någon loggfil) eller en bild. Jag har bara kollat på kommandodelen och gjort en geekchic datumgrej som alltid syns på desktopen.

Så snyggt!
Datum/klockgrejen består av 4 olika "geeklets" som alla använder kommandot "date" i olika varianter.
Veckodag: date +%A
Månad: date +%B
Klocka (24H): date +%H:%M
Datum: date +%d

Jag har även gjort ett script som visar hur mycket minne som används och är ledigt.

Hur mycket minne har jag kvar?
Det scriptet är en riktig dräpare:
top -l 1 -n 1 | grep 'PhysMem' | cut -c 10-80 | awk -F ", " '{print toupper($4) " | " toupper(substr($5,1,length($5)-1))};'

Vi skulle kunna göra ett skript som berättar för oss om det är fredag eller inte, så att vi slipper kolla sajten http://isitfriday.biz/ hela tiden...

Det ser ut ungefär såhär (jag har amerikansk locale, har du svensk får du modifiera en aning)

date +%A | awk '{ if($1 == "Friday") print "Idag är det FREDAG!"}'

Placeras lämpligen över hela desktopen med väl tilltagen font.

23 september, 2011

Bilder galore

När mock-bilder behövs av viss dimension, färg, typ (jpg, png eller gif)  eller textinnehåll är http://dummyimage.com/ är klockren tjänst. Om en GUI-design skall visas upp för kund i ett tidigt stadie, är det önskvärt att göra det utan bells and whistles. Detta eftersom det kan vara väldigt svårt att bortse ifrån den där fula färgen, eller bilden som inte förmedlar den profil som önskas i slutprodukten. Men om bilderna ser ut

såhär!
blir det enklare att se den stora bilden (minska den kognitiva belastningen).


22 september, 2011

En hyllning!

Ibland springer man på ramverk (stora som små) som gör precis det man vill utan att vara i vägen. Jsoup är ett sådant.

Jsoup är en HTML-parser (Java-bibliotek) med stöd för CSS-selector syntax för att söka ut element i det parsade DOM-trädet. I mitt nuvarande uppdrag behöver jag jobba en hel del med screen-scraping av andra webbsajter och JSoup gör jobbet enkelt för mig. För att hämta ut länkar från en sajt (och göra länkarna absoluta):

try {
    Document htmlDoc = Jsoup.connect("http://www.google.se").timeout(2000).get();
    Elements advertiseLinks = htmlDoc.select("#fll > a");
    for(Element element : advertiseLinks){
       String absoluteHref = element.absUrl("href");
       String text = element.text();
       System.out.println(String.format("href: %s, text: %s", absoluteHref, text));
    }
} catch (IOException ex) {
            // Ignore right now
}

// Skriver ut:
// href: http://www.google.se/intl/sv/ads/, text: Annonsera med Google
// href: http://www.google.se/services/, text: Företagslösningar
// href: http://www.google.se/intl/sv/about.html, text: Allt om Google
// href: http://www.google.com/ncr, text: Google.com in English

I exemplet hämtas länkarna från google.se (de som finns i den div med id 'fll') och görs absoluta, svårare än såhär är det inte. En vinnnade kombination är Jsoup och Firebug till Firefox.

Förutom screen-scaping kan Jsoup användas för att tvätta html som hämtas från en annan sajt (RSS eller liknande) eller matas in av en användare. Även detta löser Jsoup med bravur genom användandet av s.k. Whitelist's. Det finns ett antal färdiga Whitelists som kan användas, från restriktiva till avslappnad säkerhetsnivå. Rensning av html ser ut på följande sätt: (kod från jsoup.org)

String unsafe = "Link";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// now: Link

Detta var bara en mycket ytlig översikt av detta mycket imponerande ramverk kan göra. Om Ni någonsin behöver jobba med HTML i en Java-applikation så vet ni vilket verktyg ni skall använda :-)