mvvmcross和身份验证

时间:2013-11-19 03:56:41

标签: mvvmcross azure-mobile-services

有没有办法在mvvmcross框架中通过Facebook验证用户?我目前正在尝试使用Mobile Azure Service对Facebook进行身份验证,但我没有任何成功。如果不使用mvvmcross,我可以进行身份​​验证。

谢谢! 标记

1 个答案:

答案 0 :(得分:6)

在MVVM意义上我发现的是不,你不能。 Facebook登录页面上的属性不具有可绑定性,也不应该是最佳对象,并且最好将其视为控制之外的模态视图

我要做的是将其视为关注点,并使用Xamarin.Auth进行身份验证。

作为一个例子,假设你有一个LoginView和LoginViewModel。

LoginView提供标准登录电子邮件/密码,但有一个选项(按钮)可通过Facebook进行身份验证

从该视图连接到facebooklogin按钮的touchupinside事件

this.btnFacebookLogin.TouchUpInside += (object sender, EventArgs e) =>
{
    DoFacebookLogin ();
}

然后在你的DoFacebookLogin方法中“呈现”这里描述的facebook的viewcontroller https://github.com/xamarin/Xamarin.Auth/blob/master/GettingStarted.md

例如:

private void DoFacebookLogin ()
{
    var auth = new OAuth2Authenticator (
        clientId: "yournumericclientidhere",
        scope: "",
        authorizeUrl: new Uri ("https://m.facebook.com/dialog/oauth/"),
        redirectUrl: new Uri ("http://www.facebook.com/connect/login_success.html"));

        auth.AllowCancel = true;

        auth.Completed += (sender, eventArgs) => {
            DismissViewController (false, null);
            if (eventArgs.IsAuthenticated) {
                string user = eventArgs.Account.Serialize ();
                var messenger = Mvx.Resolve<IMvxMessenger> ();
                messenger.Publish (new FacebookLoggedIn (user));
            } else {
                // Cancelled here
            }
        };

        var vc = auth.GetUI ();
        this.PresentViewController (vc, true, null);
    }

取消不需要处理,因为模态viewcontroller会将你带回LoginView

如果成功解除了viewcontroller,那么我会使用mvx对eventaggregator(plugins.messenger)的解释来向viewmodel发送一条消息,告知facebook模式视图已关闭,可以通过该消息传递帐户详细信息 - accesstoken等回到viewmodel按你的意愿去做。

查看(如上所述):

string user = eventArgs.Account.Serialize();
var messenger = Mvx.Resolve<IMvxMessenger> ();
messenger.Publish (new FacebookLoggedIn (user));

PCL中的消息类:

public class FacebookLoggedIn : MvxMessage
{
    public FacebookLoggedIn(object sender) : base(sender) {}
}

ViewModel也在您的PCL中:

public LoginViewModel()
{
    var messenger = Mvx.Resolve<IMvxMessenger> ();
    user = messenger.SubscribeOnMainThread<FacebookLoggedIn> (OnFacebookLoggedIn);
}

private void OnFacebookLoggedIn (FacebookLoggedIn MvxMessage)
{
    ... do something with the accesstoken? call your IUserService etc
    ShowViewModel<MainViewModel> ();
}

由于您正在解雇facebook viewcontroller,您会在自动导航到MainView之前发现自己回到loginview上

在您的视图项目中,您需要确保加载插件,否则在构建视图模型期间会收到错误,因此在setup.cs中

protected override void InitializeLastChance ()
{
    Cirrious.MvvmCross.Plugins.Messenger.PluginLoader.Instance.EnsureLoaded();

    base.InitializeLastChance ();
 }

此外,您还可以在本地存储帐户凭据,这在AccountStore.Create()下的Xamarin.Auth链接中有所描述。保存。请注意,如果您收到平台不支持的异常,请将PLATFORM_IOS作为预处理程序指令添加到您的项目中。

我意识到这个问题已经有几个月的历史了,但是由于谷歌的价格很高,我认为我会提供一个答案,因为没有任何