Utiliser l'authentification OAuth2 de Foursquare sur un site ASP.NET MVC 3
Par Thierry THOUA le jeudi, septembre 8 2011, 20:58 - ASP.NET - Lien permanent
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>
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".
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"); }
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 };
public void RequestUserAuthorization(string url) { DotNetOpenAuth.OAuth2.WebServerClient client = new WebServerClient(FoursquareServiceDescription) { ClientIdentifier = clientIdentifier, ClientSecret = clientSecret }; client.RequestUserAuthorization(returnTo: new Uri(url)); }
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 }; }

