Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)
关于Account Kit
什么是免密验证?
免密验证不需要密码来注册或登录。用户通过验证的方式有两种,一次发给用户手机的SMS认证码,或者一次发给用户邮箱的链接。
为什么使用免密验证?
- -给予用户无缝的登录或注册体验。
- -保持对app的安全访问,因为用户不需要反复使用密码或者求助于猜测密码(比如说password )
- -避免给用户增加创建并记住密码的负担
在这篇快速学习手册中,我将展示如何在安卓app中使用Facebook的Account Kit来进行免密验证。 用户可以通过手机号码或邮箱地址来注册或登录。用户甚至不需要有被授权的Facebook账号。
除此之外,Account Kit 还很容易实现,还能让你免于建立登录系统。

Account Kit如何工作
下面的图标显示了Account Kit 工作原理。

验证发生在用户与app之间的一系列交换之后。首先用户初始化登录,也许是通过手机加载app。 然后验证码发送到用户的SMS,或者给邮箱发送一次性链接。再然后,假如用户输入验证码或者点击了链接,用户即通过了验证。
Facebook的Account Kit 的另外一个酷炫的特性是当用户将手机号输入到app时,Account Kit 尝试将输入的手机号码与用户Facebook绑定的手机号码进行匹配。假如用户登录了Facebook的安卓app,并且手机号码匹配成功,Account Kit将不会发送SMS验证码,并且用户将更加丝滑地登录进来。
使用Account Kit
1.准备工作
开始使用Account Kit之前,你需要:
- 一个Facebook开发者账号
- 集成Account Kit的app
2.打开Account Kit
进入你的APP页面,点击Add Product页面,选择Account Kit。然后点击Get Started按钮增加Account Kit。你将会看到Account Kit的配置页面。
3.声明依赖
在build.gradle文件增加Account Kit SDK最新版本的依赖,然后同步工程。
repositories { jcenter() } dependencies { compile 'com.facebook.android:account-kit-sdk:4.+' }
4.更新AndroidManifest.xml
在AndroidManifest.xml文件中增加Facebook app的ID,Account Kit客户端token(在Account Kit设置页面获取)和INTERNET权限。
<uses-permission android:name="android.permission.INTERNET" />
<meta-data android:name="com.facebook.accountkit.ApplicationName" android:value="@string/app_name" /> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/FACEBOOK_APP_ID" /> <meta-data android:name="com.facebook.accountkit.ClientToken" android:value="@string/ACCOUNT_KIT_CLIENT_TOKEN" /> <activity android:name="com.facebook.accountkit.ui.AccountKitActivity" android:theme="@style/AppLoginTheme" tools:replace="android:theme"/>
5.更新资源文件
将APP ID和Account Kit客户端token添加到strings.xml文件。
<string name="FACEBOOK_APP_ID">YourAPPId</string> <string name="ACCOUNT_KIT_CLIENT_TOKEN">YourAccountKitClientToken</string>
还要将Account Kit主题添加到styles.xml.
<style name="AppLoginTheme" parent="Theme.AccountKit" />
6.初始化SDK
在Application类中,初始化SDK(记得在AndroidManifest.xml文件中添加android:name
)。
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AccountKit.initialize(getApplicationContext()); } }
7.初始化登录
我们必须为SMS和email登录验证写独立的handler。
对于SMS,在第5行,我们指定了登录类型LoginType.PHONE
。
public void onSMSLoginFlow(View view) { final Intent intent = new Intent(this, AccountKitActivity.class); AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder = new AccountKitConfiguration.AccountKitConfigurationBuilder( LoginType.PHONE, AccountKitActivity.ResponseType.CODE); // or .ResponseType.TOKEN // ... perform additional configuration ... intent.putExtra( AccountKitActivity.ACCOUNT_KIT_ACTIVITY_CONFIGURATION, configurationBuilder.build()); startActivityForResult(intent, 101); }
对于email,在第5行,我们指定登录类型LoginType.EMAIL
。
public void onEmailLoginFlow(View view) { final Intent intent = new Intent(this, AccountKitActivity.class); AccountKitConfiguration.AccountKitConfigurationBuilder configurationBuilder = new AccountKitConfiguration.AccountKitConfigurationBuilder( LoginType.EMAIL, AccountKitActivity.ResponseType.CODE); // or .ResponseType.TOKEN // ... perform additional configuration ... intent.putExtra( AccountKitActivity.ACCOUNT_KIT_ACTIVITY_CONFIGURATION, configurationBuilder.build()); startActivityForResult(intent, 101); }
8.画登录界面
下面是简单的登录界面,点击SMS登录或者email登录。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.chikeandroid.tutsplus_facebook_accountkit.MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login By SMS" android:onClick="onSMSLoginFlow"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Login By Email" android:onClick="onEmailLoginFlow"/> </LinearLayout>
9.处理登录返回的响应。
现在,用户想要登录,在onActivityResult()方法处理响应。在这个方法里,我们能够处理成功,取消和失败的验证结果。
@Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 101) { // confirm that this response matches your request AccountKitLoginResult loginResult = data.getParcelableExtra(AccountKitLoginResult.RESULT_KEY); String toastMessage; if (loginResult.getError() != null) { toastMessage = loginResult.getError().getErrorType().getMessage(); showErrorActivity(loginResult.getError()); } else if (loginResult.wasCancelled()) { toastMessage = "Login Cancelled"; } else { if (loginResult.getAccessToken() != null) { toastMessage = "Success:" + loginResult.getAccessToken().getAccountId(); } else { toastMessage = String.format( "Success:%s...", loginResult.getAuthorizationCode().substring(0, 10)); } // If you have an authorization code, retrieve it from // loginResult.getAuthorizationCode() // and pass it to your server and exchange it for an access token. // Success! Start your next activity... goToMyLoggedInActivity(); } // Surface the result to your user in an appropriate way. Toast.makeText(this, toastMessage, Toast.LENGTH_LONG).show(); } }
完整的app
现在运行APP,测试SMD和email登录。
现在Account Kit JavaScript SDK不支持WebView登录,所以你不能从WebView登录Account Kit。你必须自己写原生代码来登录。
结语
在这篇短文中,你学到了使用Facebook的Account Kit来进行免密验证:包括什么是Account Kit,为什么要使用它和如何在安卓APP中实现它。
警告:免密验证不是很安全。对于安全性更重要的人不会使用它,比如银行APP。 所以要慎重考虑何时使用Account Kit,何时在传统验证模式下使用。
想了解更多关于Facebook Account Kit,参考official documentation。如果想学习更多的安卓开发知识,可查看Envato Tuts+的其他文章。
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post