ServiceStack和FacebookAuthProvider

时间:2013-04-11 21:21:20

标签: servicestack

我一直在使用ServiceStack及其Auth提供商。特别是“FacebookAuthProvider”。 我的问题是该服务是从iOS应用程序调用的。这个应用程序已经有一个有效的访问令牌,我只想将此值传递给servicestack facebook身份验证。

我在servicestack github页面上看过测试,但它对我来说仍然没有意义。

是否可以将此访问令牌传递给servicestack,因此身份验证会跳过我要求权限的部分,因为我们已经在应用程序上执行了此操作?

或者我是以错误的方式处理这个问题?

1 个答案:

答案 0 :(得分:3)

我没有使用内置的facebook auth提供程序,而是创建了自己的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;
        }
    }
}

我希望这是有道理的。