2013-04-11 7 views
5

私はServiceStackで作業しており、それはAuthプロバイダです。特に "FacebookAuthProvider" 私の問題は、サービスがiOSアプリケーションから呼び出されていることです。このアプリはすでに有効なアクセストークンを持っています。私はこの値をサービスマンのfacebook認証に渡したいだけです。ServiceStackとFacebookAuthProvider

私はservicestack githubページのテストを見ましたが、まだ私には意味がありません。

サービストークンにこのアクセストークンを渡すことはできますか?私は許可を求める部分をスキップします。

これは間違った方法で近づいていますか?

+0

これを行う方法はありますか? – fractal

答えて

3

私は独自のCustomFacebookAuthProviderを作りました。 なぜなら、組み込みバージョンでは認証のためにユーザーをFacebookにリダイレクトするためのブラウザが必要であり、私はそれを必要としなかったからです。私はすでにアクセストークンを持っていました。

公式バージョンFacebookAuthProvider.csに基づいて私は自分自身を作成し​​ました。

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; 
     } 
    } 
} 

私はそれが理に適ったと思います。

+0

アラン、あなたはどのようにjsonを返っているのですか?また、「/ auth/facebook」を持つ組み込みのものなど、認証プロバイダにアクセスするためにURLをどのように設定しますか? – pug