认证是应用成功的关键。看看你的应用程序,我敢打赌,你的用户首先要做的就是注册或登录到他们的帐户。反过来,这可能会利用某种形式的社会认证。每个社会身份验证提供者都有点不同,一些像脸书网这样的用户提供了一个原生SDK来简化登录过程,并为他们的服务提供额外的功能。此前,我们研究了如何将脸书网SDK集成到iOS中,以提供原生登录体验,以及如何与Azure应用程序的Azure应用程序集成。今天,我将向你展示如何使用脸书网Android SDK在Android和xamarin.forms简化登录过程。

为什么使用原生软件开发工具包?

提供了一个简单LoginAsync方法,在使用Chrome自定义标准执行安装登录时会执行。然而,这仍然要求用户输入他们现有的用户名和密码,即使他们已经在他们的设备上安装了提供者的应用程序。利用本机SDK为脸书网、谷歌或微软提供安全和精简的经验,并提供本地用户界面控制,使您的用户在登录时感到安全。

使用脸书谁登录

在我们开始将脸书网认证集成到我们的应用程序之前,我们必须在脸书开发网站上注册一个新应用。

接着,我们要添加一个适当的OAuth重定向,可以通过添加“脸书网登录”产品来完成:

对于这个应用程序,我们将使用Azure应用程序服务,这意味着我们可以指定一个重定向URL,例如:

,您可以了解更多关于配置的内容。

入门

随着我们的脸书网应用程序的建立,我们现在可以开始集成脸谱网Android SDK,可以从安装到我们的应用。 这是由脸书网提供给Xamarin.Android绑定到离线离线SDK , which allows us to use all of the features available to Java and Kotlin developers.这使我们能够使用所有可用的java和Kotlin开发的特点。

When installing this NuGet, it’s important for us to ensure that we have installed the latest Android Support Libraries as well, as they are a dependency.

配置我们的应用

在实现登录过程之前,必须执行一些额外的设置。我们可以在我们的字符串资源中添加我们收到的脸书网应用程序ID和应用程序的名称:

点击(此处)折叠或打开

  1. <string name="app_name">Coffee Cups</string>
  2. <string name="app_id">605355546285789</string>

脸书网SDK将寻找可以使用装配标志公开的元数据。我倾向于把这些连同所需的权限放进入我的AssemblyInfo.cs文件:

点击(此处)折叠或打开

  1. [assembly: MetaData("com.facebook.sdk.ApplicationId", Value = "@string/app_id")]
  2. [assembly: MetaData("com.facebook.sdk.ApplicationName", Value = "@string/app_name")]
  3.  
  4. [assembly: Permission(Name = Android.Manifest.Permission.Internet)]
  5. [assembly: Permission(Name = Android.Manifest.Permission.WriteExternalStorage)]

在脸书注册我们的安卓应用

我们可以在脸书网开发者网站上添加安卓平台,这样脸书网就有了更多关于我们应用程序的信息。这就要求我们的包名、类名、密钥散列。

我们的包的名称直接来自AndroidManifest.xml。MainActivity类名可以手动设置,如:

点击(此处)折叠或打开

  1. [Activity (Label = "Coffee Cups", Icon = "@drawable/icon",
  2.         Name = "com.refractored.coffeecups.MainActivity",
  3.         MainLauncher = true,
  4.         ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]



们关键的哈希值可以使用Android的密钥库签名工具Visual Studio的发现。现在,我们可以使用默认的密钥库的调试,但是,我们将要使用的密钥库,我们使用我们的应用程序签署发布App商店之前。
最后可以通过Visual Studio的Android Keystore Signature工具包.来查找关键的哈希值。 现在,我们可以使用默认的密钥库的调试,但是,在发布到应用商店之前,我们使用签署发布应用的KeyStore。

添加一个脸书登录按钮

现在,是我们最后添加一个登录按钮来启动整个过程的时候了。如果你正在使用Android原生用户接口开发一个Xamarin.Android应用,你可以从脸书开发工具包来简单插入一个登录按钮:

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android=""
  3.     xmlns:facebook=""
  4.     android:orientation="vertical"
  5.     android:layout_width="fill_parent"
  6.     android:layout_height="fill_parent"
  7.     android:background="#FFF">
  8.         <com.facebook.login.widget.LoginButton
  9.             android:layout_width="wrap_content"
  10.             android:layout_height="wrap_content"
  11.             android:layout_marginTop="5dp"
  12.             android:layout_gravity="center_horizontal"
  13.             facebook:com_facebook_confirm_logout="false"
  14.             facebook:com_facebook_tooltip_mode="never_display" />
  15. </LinearLayout>


Xamarin.Forms 自定义控件

如果你使用Xamarin.Forms,我们必须写一个非常小的自定义控件。首先,在我们的共享代码中,创建一个可以在XAML中访问的脸书登录按钮:

点击(此处)折叠或打开

  1. public class FacebookLoginButton : Xamarin.Forms.View
  2. {
  3. }

然后能够将其添加到我们的应用中的任何界面:

点击(此处)折叠或打开

  1. </code><?xml version="1.0" encoding="utf-8" ?>
  2. <ContentPage xmlns=""
  3.              xmlns:x=""
  4.              xmlns:controls="clr-namespace:CoffeeCups.View;assembly:CoffeeCups"
  5.              x:Class="CoffeeCups.View.LoginPage">
  6.     <ContentPage.Content>
  7.         <StackLayout HorizontalOptions="CenterAndExpand"
  8.                      VerticalOptions="CenterAndExpand"
  9.                      Padding="8">
  10.             <Label Text="Login for Coffee!"
  11.                    VerticalOptions="Center"/>
  12.             <controls:FacebookLoginButton/>
  13.         </StackLayout>
  14.     </ContentPage.Content>
  15. </ContentPage>

然后我们可以写个小的定制渲染器 , 该渲染器将显示本地登录按钮:

点击(此处)折叠或打开

  1. using CoffeeCups.View;
  2. using Xamarin.Forms;
  3. using CoffeeCups.Droid;
  4. using Xamarin.Forms.Platform.Android;
  5. using Xamarin.Facebook.Login.Widget;
  6.  
  7. [assembly: ExportRenderer(typeof(FacebookLoginButton), typeof(FacebookLoginButtonRenderer))]
  8. namespace CoffeeCups.Droid
  9. {
  10.     public class FacebookLoginButtonRenderer : ViewRenderer<FacebookLoginButton, LoginButton>
  11.     {
  12.         LoginButton facebookLoginButton;
  13.         protected override void OnElementChanged(ElementChangedEventArgs<FacebookLoginButton> e)
  14.         {
  15.             base.OnElementChanged(e);
  16.             if(Control == null || facebookLoginButton == null)
  17.             {
  18.                 facebookLoginButton = new LoginButton(Forms.Context);
  19.                 SetNativeControl(facebookLoginButton);
  20.             }
  21.         }
  22.         
  23.     }
  24. }


因为我们使用了原生脸书SDK,当用户登录就可以看到弹出原生 脸书登录,或者,如果他们已经安装了脸书应用程序,他们可以使用一个按钮点击立即登录应用:

控制登录过程

当用户登录时,在登录成功时,取消时,或者错误发生时我们必须处理实际的登录事件。在我们的MainActivity中,或者其它显示登录按钮的Activity中,我们实现一个简单的接口IFacebookCallback来处理这些事件。

点击(此处)折叠或打开

  1. class FacebookCallback<TResult> : Java.Lang.Object, IFacebookCallback where TResult : Java.Lang.Object
  2. {
  3.     public Action HandleCancel { get; set; }
  4.     public Action<FacebookException> HandleError { get; set; }
  5.     public Action<TResult> HandleSuccess { get; set; }
  6.  
  7.     public void OnCancel()
  8.     {
  9.         HandleCancel?.Invoke();
  10.     }
  11.  
  12.     public void OnError(FacebookException error)
  13.     {
  14.         HandleError?.Invoke(error);
  15.     }
  16.  
  17.     public void OnSuccess(Java.Lang.Object result)
  18.     {
  19.         HandleSuccess?.Invoke(result.JavaCast<TResult>());
  20.     }
  21. }
现在,我们可以初始化脸书SDK,注册登录回调,妥善处理:

点击(此处)折叠或打开

  1. ICallbackManager callbackManager;
  2.  
  3. protected override void OnCreate (Bundle bundle)
  4. {
  5.  
  6.    //Standard OnCreate Intialization
  7.  
  8.     FacebookSdk.SdkInitialize(ApplicationContext);
  9.     callbackManager = CallbackManagerFactory.Create();
  10.  
  11.     var loginCallback = new FacebookCallback<LoginResult>
  12.     {
  13.         HandleSuccess = loginResult =>
  14.         {
  15.  
  16.             var facebookToken = AccessToken.CurrentAccessToken.Token;
  17.             //Login here
  18.         },
  19.         HandleCancel = () =>
  20.         {
  21.             //Handle Cancel
  22.         },
  23.         HandleError = loginError =>
  24.         {
  25.             //Handle Error
  26.         }
  27.     };
  28.  
  29.     LoginManager.Instance.RegisterCallback(callbackManager, loginCallback);
  30.  
  31.     //Finish or load Xamarin.Forms app here
  32. }
  33.  
  34. protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
  35. {
  36.     base.OnActivityResult(requestCode, resultCode, data);
  37.  
  38.     callbackManager.OnActivityResult(requestCode, (int)resultCode, data);
  39. }
注意,我们现在可以访问脸书访问令牌,它可以使我们登录,并且让我们附加调用脸书服务。


登录应用服务

使用令牌,我们可以使用MobileServiceClient登录我们的Azure应用服务。

点击(此处)折叠或打开

  1. var facebookToken = AccessToken.CurrentAccessToken.Token;
  2. var token = new JObject();
  3. token["access_token"] = facebookToken;
  4. var user = await Client.LoginAsync(MobileServiceAuthenticationProvider.Facebook, token);

当我们这样做时,我们得到一个MobileServiceUser, 它包含一个包含我们后台APP服务的新令牌。需要注意的是 , 该令牌是与 脸书令牌发送给我们 ,并且,在这个功能中,它将重新混合存储到MobileServiceUser中。


了解更多

正如我们已经看到这里,这是我们的优势,在使用本地认证SDK时可以简化用户登录过程应用,这只需要几行代码。为了学习更多关于在你的移动应用中的, 请确认阅读大文档 ,它包含了怎样通过自定义URL设计添加  此外,你可以找到一个我的简单应用Coffee Cup, 我用来证明该概念在这篇博文中 ,请访问GitHub

转载请标明出处。