Utiliser l'authentification OAuth2 de Foursquare sur un site ASP.NET MVC 3

Oauth a tendance à se généraliser dans le monde web pour l'authentification. Une des forces du système est la simplicité avec laquelle on centralise les informations et on s'authentifie ! L'exemple de ce post montre comment prendre n'importe quel site Web ASP.NET MVC 3 et ajouter un mécanisme d'authentification différent du "MemberShip" classique. Vous pouvez trouver plus d'informations sur OAuth via ce lien.

La première opération est de récupérer une librairie supportant OAuth2. Ici, j'ai fait le choix de prendre DotNetOpenAuth en version bêta (supportant donc OAuth 2).
La seconde opération est d'aller sur le site de foursquare et d'enregistrer son application afin d'obtenir une clé. Il est très important de correctement définir l'adresse url du site sur lequel on ajoute la fonctionnalité ou le processus d'authentification ne fonctionnera pas!

Le moment est venu d'implémenter notre code sur notre site. Nous allons donc aller dans notre page de login dans le controlleur Account. Nous ajoutons une image (le logo de foursquare) ainsi qu'une action dessus. Lorsque l'utilisateur cliquera sur l'image, l'action "LogOnFoursquare" s'exécutera.

<a href="@Url.Action("LogOnFoursquare""Account")">
   <img src="@Url.Content("~/Images/foursquare_logo.png")" alt="" style="height:30px;width:100px" /></a>
Evidement, comme vu au dessus, nous devons ajouter l'action dans le controlleur Account. C'est à cet endroit que l'on exécutera l'authentification OAuth2. Fonctionnant en multi couches, je décide donc de créer une classe FoursquareConnect (qui sera décrite/implémentée plus bas). Le constructeur reçoit en paramètre la clé client et notre clé secrète. Ces deux informations ont été fournies par le site de Foursquare lors de notre enregistrement.
Il est donc maintenant possible de créer la méthode (vide) demandant un token et envoyant l'url de retour. Avec cette classe, j'ai la possibilité de terminer ma méthode "LogOnFoursquare".
Il est temps d'implémenter la méthode "OAuthFoursquare" que l'on a référencé en adresse de callback dans notre précédente méthode. Nous pouvons donc "processer" la demande et récupérer le user pour le sauvegarder (ici dans le futur dans un cookie session). La dernière étape est de rediriger l'utilisateur sur la page "Home".
private static readonly FoursquareConnect foursquare = new FoursquareConnect("clientID""secretID");
public ActionResult LogOnFoursquare()
{
   var url = string.Format("{0}://{1}/Account/OAuthFoursquare",
                              Request.Url.Scheme,
                              Request.Url.Authority);
   foursquare.RequestUserAuthorization(url);
   return null;
}
public ActionResult OAuthFoursquare()
{
   OAuthUser user = foursquare.ProcessUserAuthorization();
   CreateAuthCookie(user);
   return RedirectToAction("Index""Home");
}
A ce moment nous avons la structure de l'authentification mais il manque l'implémentation même de notre classe FoursquareConnect. Nous allons donc le faire ci-dessous.
La première étape est d'enregistrer la description du service (cfr ci-dessous).
private static readonly AuthorizationServerDescription FoursquareServiceDescription = new AuthorizationServerDescription
{
   AuthorizationEndpoint = new Uri("https://fr.foursquare.com/oauth2/authorize"),
   TokenEndpoint = new Uri("https://fr.foursquare.com/oauth2/access_token"),
   ProtocolVersion = DotNetOpenAuth.OAuth2.ProtocolVersion.V20
};
Ensuite voici le moment d'implémenter la méthode demandant un "token".
public void RequestUserAuthorization(string url)
{
   DotNetOpenAuth.OAuth2.WebServerClient client = new WebServerClient(FoursquareServiceDescription)
   {
      ClientIdentifier = clientIdentifier,
      ClientSecret = clientSecret
   };
   client.RequestUserAuthorization(returnTo: new Uri(url));
}
Enfin, nous pouvons implémenter la méthode recevant la réponse. Celle-ci sera traduite par la méthode GetUser.
public OAuthUser ProcessUserAuthorization()
{
   DotNetOpenAuth.OAuth2.WebServerClient client = new WebServerClient(FoursquareServiceDescription)
   {
      ClientIdentifier = clientIdentifier,
      ClientSecret = clientSecret
   };
   var result = client.ProcessUserAuthorization();
   return GetUser(result.AccessToken);
}
private OAuthUser GetUser(string token)
{
   HttpClient request = new HttpClient();
   var response = request.Get("https://api.foursquare.com/v2/users/self?oauth_token=" + token);
   JObject obj = (JObject)JsonConvert.DeserializeObject(response.Content.ReadAsString());
   return new OAuthUser
   {
      Id = (string)obj.SelectToken("response.user.id"),
      UserName = (string)obj.SelectToken("response.user.firstName") + " " + (string)obj.SelectToken("response.user.lastName"),
      AccessToken = token,
      UserType = UserType.Foursquare
   };
}
La dernière étape pour faire fonctionner votre authentification consiste à créer un cookie en enregistrant votre utilisateur. Je ne l'explique pas  dans ce post. Je vous invite à regarder ces deux liens:
- http://www.hanselman.com/blog/AccessingTheASPNETFormsAuthenticationTimeoutValue.aspx

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet

Page top