Verificering af LinkedIn access token

Udfordringen

Du har en app hvor brugerne kan logge på via LinkedIn’s mobil SDK. Dvs. app’en kommunikerer med LinkedIn’s api som herefter returnerer et access token. Du vil så nok umiddelbart mene, at der herefter blot er et spørgsmål om sende access token videre til din backend. Her vil din server applikation bede LinkedIn om den nødvendige bruger information. Men ak og ve! Du får blot en 401 (unauthorized) retur. Brugerdata kan app’en naturligvis hente og smide videre til din backend. Men din backend ved stadig ikke om disse data kommer fra en bruger der rent faktisk er logget på, og det giver jo et slemt sikkerhedshul.

I dokumentationen kan man læse, at et token der er hentet via SDK for mobile enheder, ikke kan bruges andres steder:

Mobile vs. server-side access tokens

It is important to note that access tokens that are acquired via the Mobile SDK are only usable with the Mobile SDK, and cannot be used to make server-side REST API calls.  Similarly, access tokens that you already have stored from your users that authenticated using a server-side REST API call will not work with the Mobile SDK.

Presently, there is no mechanism available to exchange them.  If you require tokens that can be used in both the mobile and server-side environment, you will need to implement a traditional OAuth 2.0 solution within your iOS environment to acquire tokens that can be leveraged in both situations.

(Kilde: developer.linkedin.com/docs/ios-sdk-auth)

Som det står skrevet, kunne man så vælge at skifte til OAuth 2.0. Men så mister man en væsentlig fordel, nemlig den at brugeren kan logge på din app, uden at angive adgangskode, når blot LinkedIn app’en er installeret på enheden og brugeren er logget ind dér.

Løsningen

I vores søgning på en løsning fandt vi at nogen åbenbart har gravet i LinkedIn SDK kildekoden og fundet denne lille udokumenterede feature: x-li-src:msdk

Hvis du sender den med i din header, sammen med brugerens access token, kan du fint kommunikere med LinkedIn’s REST api, selvom token er rekvireret via mobile SDK. Jeg formoder at msdk står for “mobile sdk”. Dvs. at hvis blot du fortæller hvorfra dette access token er rekvireret, er alt ok.

Her et kode eksempel der viser hvordan du således kan verificere access token i PHP: