Twitter, OAuth & LinqToTwitter for dummies

Un petit post qui explique basiquement comment fonctionne l’authentification d’une application twitter.

Le souci très vite rencontré c’est OAuth. Tout comme OData et tous les Oxxx, la documentation est hyper fournie, voir trop fournie… ce qui fait que l’on perd vite pied dans des détails techniques. Ce que je propose ici ce n’est pas de savoir comment fonctionne OAuth et twitter mais de savoir pratiquement comment authentifier son appli.

Tout d’abord un tout petit peu de théorie sur ce que l’on va faire. On partira de l’application que je développe actuellement, TwittLook, intégrant Twitter à OutLook 2010.

On a deux scénarios, « first connection » et « daily connection ».

First Connection

– L’application TwittLook possède deux clefs sur le principe de clefs privé/publique. Ce qui est cool, c’est que à part le fait que l’on devra garder la seconde « secrète », la seul chose que l’on fera avec, c’est les renseigner dans deux propriétés, LinqToTwitter s’occupe du reste (sans jeux de mots ^^).

– Ensuite notre application renverra l’utilisateur vers twitter directement afin qu’il valide l’accès de notre application à son compte.

– Si l’utilisateur accepte, il recevra un code PIN que l’on utilisera pour générer deux nouvelles clefs. Ces deux clefs seront stockées et nous permettrons les fois suivante de directement se connecter au compte de l’utilisateur.

Daily Connection

– Idem que le point 1 de First Connection

– On renseigne les tokens obtenue au point 3 de First Connection

– Enjoy 🙂

Et c’est tout… Sur ces deux scénarios sont résumé tout ce qu’il est nécessaire de connaitre pour developper une appli twitter ! Plus leger que les 120pages de RFC OAuth n’est-ce pas ?

Maintenant, comment fait-on concrètement ?

Premièrement, si ce n’est déjà fait, rendez-vous sur la partie développeur de twitter et enregistrez votre application. C’est gratuit et sans validation, le seul requirement c’est un compte valide. Cette authentification nous permettra d’obtenir les deux clefs. La première peut être public, la seconde doit rester privée (et donc protégée).

Les deux clefs dans le notepad, direction l’onglet settings dans la section « Application Type ». Nous allons là définir les droits d’accès de notre application. Libre à vous de prendre l’option qui vous convient selon vos besoins, la suite ne changera pas, mais de base les applications sont en Read-Only.

Les keys obtenue, nous allons créer un objet de type PinAuthorizer. Dans cet objet nous allons définir notre ConsumerKey, ConsumerSecret, Action à utiliser lorsque l’on se rend sur la page d’autorisation et une fonction à exécuter pour récupérer le code PIN. Dans mon cas j’ai stocké les key dans un fichier settings. Voici donc le code pour initialiser notre objet :

var auth = new PinAuthorizer
{
    Credentials = new InMemoryCredentials
    {
        ConsumerKey = keys.Default.ConsumerKey,
        ConsumerSecret = keys.Default.ConsumerSecret
    },
    UseCompression = true,
    GoToTwitterAuthorization = pageLink => Process.Start(pageLink),
    GetPin = () =>
    {
        Console.WriteLine("Enter the PIN Number : \n"); 
        return Console.ReadLine();
    }
};

Ensuite, si les tokens n’existent pas, cela signifie que l’application n’est pas authentifiée, nous appelons la méthode Authorize(). Ceci exécutera la méthode GoToTwitterAuthorization suivi de GetPin(). Ensuite dans notre code il nous suffit de récupéré dans la propriété Credentials les deux tokens (OAuthToken et AccessToken) que nous stockerons. Ainsi les fois suivante l’appel d’Authorize ne sera plus nécessaire. Et c’est tout ^^

Voici le code complet :

var auth = new PinAuthorizer
{
    Credentials = new InMemoryCredentials
    {
        ConsumerKey = keys.Default.ConsumerKey,
        ConsumerSecret = keys.Default.ConsumerSecret
    },
    UseCompression = true,
    GoToTwitterAuthorization = pageLink => Process.Start(pageLink),
    GetPin = () =>
    {
        Console.WriteLine("Enter the PIN Number : \n"); 
        return Console.ReadLine();
    }
};

if (keys.Default.OAuthToken.Trim() != "" && keys.Default.AccessToken.Trim() != "")
{
    auth.Credentials = new InMemoryCredentials
    {
        ConsumerKey = keys.Default.ConsumerKey,
        ConsumerSecret = keys.Default.ConsumerSecret,
        OAuthToken =  keys.Default.OAuthToken,
        AccessToken = keys.Default.AccessToken
    };
}
else
{
    auth.Authorize();
    keys.Default.OAuthToken = auth.Credentials.OAuthToken;
    keys.Default.AccessToken = auth.Credentials.AccessToken;
    keys.Default.Save();
}

if (auth.IsAuthorized)
{
    using (var twitterCtx = new TwitterContext(auth, "https://api.twitter.com/1/", "https://search.twitter.com/"))
    {
        //Log
        twitterCtx.Log = Console.Out;
        var message = twitterCtx.NewDirectMessage("TchoyTchoy", "Direct Message Test - " + DateTime.Now);
    }
}

L’API OAuth va beaucoup plus loin, notamment sur des scénarios très complexe, mais la plupart du temps, ceci devrais suffire ^^

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s