Facebook三方登录

Facebook三方登录,是用于获取Facebook账号的基本信息,如头像、别名、手机号码等,通过获取到的信息去自身平台注册对应账号,方便用户的注册。

[TOC]

集成准备

1.创建Facebook应用

2.应用配置信息

功能实现

1.配置仓库

// project/bulid.gradle:
allprojects {
    repositories {  
        jcenter()
    }
}

// app/bulid.gradle:
implementation 'com.facebook.android:facebook-login:[5,6)'

2.清单文件和资源

//网络权限
<uses-permission android:name="android.permission.INTERNET"/>
//配置facebookId,可查看应用id填写
<meta-data
     android:name="com.facebook.sdk.ApplicationId"
     android:value="@string/facebook_app_id" />

//配置对应的FacebookActivity,用于登录跳转Facebook应用
<activity
     android:name="com.facebook.FacebookActivity"
     android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
     android:label="@string/app_name" />
//配置无安装Facebook时,网页跳转界面
<activity
     android:name="com.facebook.CustomTabActivity"
     android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="@string/fb_login_protocol_scheme" />
    </intent-filter>
</activity>

//资源文件中进行配置
<string name="facebook_app_id">299548570997514</string> 
<string name="fb_login_protocol_scheme">fb299548570997514</string>

3.获取散列密钥并配置

工具类地址:https://code.google.com/archive/p/openssl-for-windows/downloads

keytool -exportcert -alias name(key的别名) -keystore C:\Users\Administrator\Desktop\key\key_name.jks(key的实际路径) | 
E:\download\openssl-0.9.8k_X64\bin\openssl(工具的绝对路径) sha1 -binary |  
E:\download\openssl-0.9.8k_X64\bin\openssl base64

//命令执行成功以后会要求输入密码,最终生成32位的随机码,需要把这些随机码作为散列密钥配置到Facebook中

//用于配置debug的时候,也使用签名key进行应用签名
signingConfigs {
    release {
        v2SigningEnabled true
    }

    debug {
        //别名
        keyAlias 'name' 
        //key密码
        keyPassword 'pw123'
        //key路径
        storeFile file('F:\\name.jks')
        //本机密码
        storePassword 'storepw123'
    }
}

4.代码实现

Application

FacebookSdk.sdkInitialize(getApplicationContext());

Actvitity

//在Activity的onCreate时对CallbackManager进行初始化
CallbackManager mCallbackManager = CallbackManager.Factory.create();

//设置对应的回调监听
LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
    @Override
    public void onSuccess(LoginResult loginResult) {
        LogUtil.d(TAG,"onSuccess-------------");
        showLoading(true);
        //成功以后去获取对应的Facebook账号信息
        getFacebookInfo(loginResult.getAccessToken());
    }

    @Override
    public void onCancel() {
        // App code
        LogUtil.d(TAG,"onCancel-------------");
    }

    @Override
    public void onError(FacebookException exception) {
        LogUtil.d(TAG, exception.toString());
        //如果是因为Facebook本身的鉴权问题,同时获取到token,则需要主动登出,防止重试无法登录
        if (exception instanceof FacebookAuthorizationException) {
            if (AccessToken.getCurrentAccessToken() != null) {
                LoginManager.getInstance().logOut();
            }
        }
    }
});

//配置回调,所有回调信息都会在mCallbackManager中
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mCallbackManager.onActivityResult(requestCode, resultCode, data);
}

//登录按钮点击事件调用代码
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));

//获取Facebook用户信息,根据key值去获取,再执行平台的登录操作
public void getFacebookInfo(AccessToken accessToken) {
    GraphRequest.newMeRequest(accessToken, (object, response) -> {
        if (object != null) {
            thirdPartyNickName = object.optString("name");
            thirdPartyUserName = object.optString("id");
          
            //go Login 
            ...
        }else {
            //fail
            showLoading(false);
            XMToastUtil.showShortToast(PadLoginActivity.this, getString(R.string.dialog_login_facebook_fail));
        }
    }).executeAsync();
}

功能校验

1.集成校验

如果点击登录按钮,Facebook应用或者网页有对应的加载框,并含有Facebook的logo图标,代码代码集成是没问题的。

2.整体校验

若遇到无法登录的情况,那必然是密钥的配置存在问题,密钥库请使用最新的库,并且校验使用的key值是否为正式key,debug调试配置的key是否也是一致的。有的手机配置错误会提示密钥散列库中不匹配,同时会把需要配置的密钥显示出来。如若key的配置是正确的,那么可以在log日志中查看到对应的错误提示。