2013-04-11 4 views
5

Ich habe mit ServiceStack gearbeitet und es ist Auth-Provider. Speziell "FacebookAuthProvider". Mein Problem hier ist, dass der Dienst von einer iOS App aufgerufen wird. Diese App hat bereits ein gültiges Zugriffs-Token und ich möchte diesen Wert nur an die facebook-Authentifizierung von servicestack übergeben.ServiceStack und FacebookAuthProvider

Ich habe die Tests auf Servicestack Github-Seite gesehen, aber es macht immer noch keinen Sinn für mich.

Ist es möglich, dieses Zugriffstoken an servicestack zu übergeben, so überspringt die Authentifizierung den Teil, wo ich um Erlaubnis frage, da wir das schon auf der App gemacht haben?

Oder stimme ich dies in die falsche Richtung?

+0

Haben Sie einen Weg gefunden, dies zu tun? – fractal

Antwort

3

Anstatt den eingebauten Facebook Auth Provider zu verwenden, habe ich meinen eigenen CustomFacebookAuthProvider erstellt. Der Grund ist, dass die eingebaute Version einen Browser benötigt, um den Benutzer zur Authentifizierung auf facebook umzuleiten und ich brauchte das nicht. Ich hatte bereits ein Zugangs-Token.

Also basierend auf der offiziellen Version FacebookAuthProvider.cs habe ich meine eigene erstellt.

using System; 
using System.Collections.Generic; 
using System.Net; 
using Elmah; 
using Mondohunter.Backend.BusinessLogic.Interfaces; 
using ServiceStack.Common.Extensions; 
using ServiceStack.Common.Web; 
using ServiceStack.Configuration; 
using ServiceStack.ServiceInterface; 
using ServiceStack.ServiceInterface.Auth; 
using ServiceStack.Text; 
using ServiceStack.WebHost.Endpoints; 

namespace Mondohunter.Interfaces 
{ 
    public class CustomFacebookAuthProvider : OAuthProvider 
    { 
     public const string Name = "facebook"; 
     public static string Realm = "https://graph.facebook.com/"; 
     public static string PreAuthUrl = "https://www.facebook.com/dialog/oauth"; 

     public string AppId { get; set; } 
     public string AppSecret { get; set; } 
     public string[] Permissions { get; set; } 

     public CustomFacebookAuthProvider(IResourceManager appSettings) 
      : base(appSettings, Realm, Name, "AppId", "AppSecret") 
     { 
      this.AppId = appSettings.GetString("oauth.facebook.AppId"); 
      this.AppSecret = appSettings.GetString("oauth.facebook.AppSecret"); 
     } 

     public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
     { 
      var tokens = Init(authService, ref session, request); 

      try 
      { 
       if (request.oauth_token.IsNullOrEmpty()) 
        throw new Exception(); 

       tokens.AccessToken = request.oauth_token; 
       session.IsAuthenticated = true; 

       var json = AuthHttpGateway.DownloadFacebookUserInfo(request.oauth_token); 
       var authInfo = JsonSerializer.DeserializeFromString<Dictionary<string, string>>(json); 

       //Here i need to update/set userauth id to the email 
       //UpdateUserAuthId(session, authInfo["email"]); 

       authService.SaveSession(session, SessionExpiry); 
       OnAuthenticated(authService, session, tokens, authInfo); 

       //return json/xml/... response; 
      } 
      catch (WebException ex) 
      { 
       //return json/xml/... response; 
      } 
      catch (Exception ex) 
      { 
       //return json/xml/... response; 
      } 
     } 

     protected override void LoadUserAuthInfo(AuthUserSession userSession, IOAuthTokens tokens, Dictionary<string, string> authInfo) 
     { 
      if (authInfo.ContainsKey("id")) 
       tokens.UserId = authInfo.GetValueOrDefault("id"); 
      if (authInfo.ContainsKey("name")) 
       tokens.DisplayName = authInfo.GetValueOrDefault("name"); 
      if (authInfo.ContainsKey("first_name")) 
       tokens.FirstName = authInfo.GetValueOrDefault("first_name"); 
      if (authInfo.ContainsKey("last_name")) 
       tokens.LastName = authInfo.GetValueOrDefault("last_name"); 
      if (authInfo.ContainsKey("email")) 
       tokens.Email = authInfo.GetValueOrDefault("email"); 
      if (authInfo.ContainsKey("gender")) 
       tokens.Gender = authInfo.GetValueOrDefault("gender"); 
      if (authInfo.ContainsKey("timezone")) 
       tokens.TimeZone = authInfo.GetValueOrDefault("timezone"); 

      LoadUserOAuthProvider(userSession, tokens); 
     } 

     public override void LoadUserOAuthProvider(IAuthSession authSession, IOAuthTokens tokens) 
     { 
      var userSession = authSession as CustomUserSession; 
      if (userSession == null) return; 

      userSession.Email = tokens.Email ?? userSession.PrimaryEmail ?? userSession.Email; 
     } 
    } 
} 

Ich hoffe, es macht Sinn.

+0

Allan, wie gibst du den JSON zurück, kannst du ein Beispiel geben? Wie konfigurierst du die URL, um auf den Auth-Provider zuzugreifen, zum Beispiel für den eingebauten "/ auth/facebook"? – pug