uniapp接Facebook登录的一次尝试(H5)

2,935 阅读6分钟

提示:移动端的APP可以直接使用 uniapp 的 uni.login ,按照官方文档来操作就好。下面文章是针对 uniapp 开发的 h5 端。

准备条件

可访问Facebook服务器
注册Facebook账号,登录Facebook(http://www.facebook.com/)

好的,啥也没有,这就乖乖去注册

开一下vpn,去上面那个网址,按照提示用邮箱开心注册了一个账号。BUT!

image.png

???三个大问号也表达不出此时的疑惑。怎么刚注册就停用我。不信邪换成手机号再注册了一个账号,结果还是停用了。这时,鼠标往下滑了一下看了这个按钮:

image.png

马上反对! 结果让我上传一张本人的自拍,我上传了(其实没必要),上传成功后FB提示我他们需要一天的时间来审核,行,反正也不急。

第二天...

今天一上班马上去登录一下看看,

image.png

OK,百度一下

zhuanlan.zhihu.com/p/580311992 这篇文章说道,可能是IP引起的,想了一下估计不是,可能是涉及到什么诡异的FB安全规范,于是在手机浏览器上尝试了一下登录,咦,登上了。好吧,乖乖按照文章提示进行双重验证,之前是用手机号注册得嘛,现在把邮箱也绑定上了。

敲黑板了: 所以其实直接在手机上注册,登录成功后按照文章所说进行双重验证就可以了,在电脑上注册时只是选择手机号和邮箱其中一个注册的,还是得去做一下双重验证。

添加双重验证后,在电脑上使用邮箱进行登录,成功登录!接下来就是在开发者中心(developers.facebook.com/) 注册成为一个开发者。

image.png

继续->输入账户的邮箱后提示:

image.png

意思是:这封邮件已经在你的Facebook账户中确认了。您可以在Facebook设置页面更改您的主要电子邮件。

所以需要一个新的邮箱?到底需要多少个邮箱....行,再去注册一个看看

弄了一下新的邮箱,输入邮箱,会拿到一个验证码邮件,看来可行,继续选择成为一个开发者,完成注册。

image.png

接下来就是要创建一个应用了,这里这里

image.png

这里就选择消费者(之前顺手选择了商务,结果企业版的Facebook登录和普通的Facebook登录不一样!死活拿不到授权,这里我们自己搞,就选消费者)

image.png

输入自己的应用名称,邮箱已经自己填好了,业务账户先不填,创建应用

image.png

在打开的控制面板里点击设置->基本

image.png

鼠标往下滑,先点添加平台,根据自己的需求选择不同平台,因为安卓的话要先上架Google商城,ios要输入包名啥的,这里先选webSite(选的时候忘了截图,这是输入好了再回来截的),输入网站地址,保存更改

image.png

image.png

上面终于做完了准备工作,从零开始就是麻烦哈,接下来就是代码部分,先尝试一下在H5上的登录,上面添加的应用也是web,安卓和IOS后面再弄。

uniapp插件市场有相关的插件:ext.dcloud.net.cn/plugin?id=5…

或者复制下面的 afu-facebookWebLogin.js文件,用的时候直接调用就好啦

/**
 * afu-facebookWebLogin
 * @description afu-facebookWebLogin是一个Facebook网页授权登录JS SDK
 */

let isFacebookInit = false;

const afuFacebookWebLogin = {};

/* 初始化授权登录环境配置动态加载Facebook官方JavaScript SDK */
afuFacebookWebLogin.asyncLoadJs = function() {
	const me = this;
	// #ifdef H5
	return new Promise((resolve, reject) => {
		let isScript = false;
		document.scripts.forEach(item => {
			if (item['src'] && item['src'] ==
				'https://connect.facebook.net/en_US/sdk.js') {
				isScript = true;
			}
		})
		if (isScript) {
			resolve(true);
		} else {
			let script = document.createElement('script')
			script.type = 'text/javascript';
			script.src = 'https://connect.facebook.net/en_US/sdk.js';
			document.body.appendChild(script);
			script.onload = () => {
				resolve(true);
			}
			script.onerror = () => {
				resolve(false);
			}
		}
	})
	// #endif
}

/* 初始化Facebook授权登录相关配置信息 */
afuFacebookWebLogin.init = async function(appId, complete = () => {}) {
	const me = this;
	// #ifdef H5
	let isAsyncLoadJs = await me.asyncLoadJs();
	if (isAsyncLoadJs) {
		if (window['FB']) {
			window['FB'].init({
				appId: appId,
				// cookie: true,
				xfbml: true,
				version: 'v12.0'
			});
			window['FB'].AppEvents.logPageView();
			isFacebookInit = true;
			complete(true);
		}
	} else {
		isFacebookInit = false;
		complete(false);
	}
	// #endif
}

/* 检查用户登录状态 */
afuFacebookWebLogin.getLoginStatus = function(complete = () => {}) {
	const me = this;
	// #ifdef H5
	if (isFacebookInit) {
		window['FB'].getLoginStatus((response) => {
			complete(response)
		});
	}
	// #endif
}

/* 通过 Javascript SDK 登录对话框登录 */
afuFacebookWebLogin.login = function(complete = () => {}, Permissions = {}) {
	const me = this;
	// #ifdef H5
	if (isFacebookInit) {
		window['FB'].login((response) => {
			complete(response)
		}, Permissions);
	}
	// #endif
}

/* 通过 Javascript SDK 退出登录 */
afuFacebookWebLogin.logout = function(complete = () => {}) {
	const me = this;
	// #ifdef H5
	if (isFacebookInit) {
		me.getLoginStatus(response => {
			if (response['status'] == 'connected') {
				window['FB'].logout((res) => {
					complete(res)
				});
			}
		})
	}
	// #endif
}

/* 通过 图谱 API 彻底取消授权应用或撤销登录 */
afuFacebookWebLogin.revocationAuthorization = function(complete = () => {}) {
	const me = this;
	// #ifdef H5
	if (isFacebookInit) {
		me.getLoginStatus(response => {
			if (response['status'] == 'connected') {
				me.api("id", (res) => {
					window['FB'].api(`/${res['id']}/permissions`, 'DELETE', (req) => {
						complete(req)
					});
				})
			}
		})
	}
	// #endif
}

/* 通过 图谱 API 查询用户信息 */
afuFacebookWebLogin.api = function(fields = "id,name", complete = () => {}) {
	const me = this;
	// #ifdef H5
	if (isFacebookInit) {
		me.getLoginStatus(response => {
			if (response['status'] == 'connected') {
				window['FB'].api('/me', 'GET', {
					"fields": fields
				}, (res) => {
					complete(res)
				});
			}
		})
	}
	// #endif
}

export default afuFacebookWebLogin;

1、先在准备进行登录的页面导入一下这个js,我这里是放在uni_modules下的

import afuFacebookWebLogin from '@/uni_modules/afu-facebookWebLogin/js_sdk/afu-facebookWebLogin.js';

2、在onload生命周期函数里初始化Facebook授权登录相关配置信息。

afuFacebookWebLogin.init(appId,(status)=>{
    if(status) {
        this.facebookShow = true
    }
})

这里的 appId 是刚刚在Facebook创建的应用编号,替换上去。可以打印一下status的值,status是个布尔值true/false来表示登录环境配置成功与否

3、检查一下用户登录状态

afuFacebookWebLogin.getLoginStatus((response)=>{
    console.log(889, response)
    
})

这里的response有三种状态:

  • response.status 为 connected 表示用户已登录 Facebook 和您的网页
  • response.status 为 not_authorized 用户已登录 Facebook,但未登录您的网页
  • response.status 为 unknown 表示用户未登录 Facebook,所以无法知道他们是否登录了您的网页。或者之前已调用 FB.logout(),因此无法连接至 Facebook

根据不同状态进行不同操作

4、登录

afuFacebookWebLogin.login((response)=>{},Permission)

这里的Permission为登录权限,具体可以看下官方文档Parameters。比如使用邮箱授权登录的话,Permission的值为{scope: 'email'}。登录成功后,如果 response.status 为 connected ,响应中会包含 authResponse 参数

5、通过 图谱 API 查询用户信息

afuFacebookWebLogin.api(fields,(response)=>{})

用户登录后可以通过这个api来查询所登录用户的信息,可以首先将fields传值为‘permissions’来获取所有用户登录时授权的权限,再根据返回的权限再调用一次这个api,fields改成刚刚获得权限信息就可以了

afuFacebookWebLogin.getLoginStatus((response)=>{
    console.log(889, response)
    //已登录
    if (response['status'] == 'connected') {
        //拿到用户登录时授权的权限
        afuFacebookWebLogin.api('permissions', res => {
            // console.log(JSON.parse(JSON.stringify(res.permissions.data)));
            let fields = 'id,name,';
            fields += res.permissions.data
                .filter(item => {
                    return item['status'] == 'granted' && item['permission'] !=
                        'public_profile';
                })
                .map(item => {
                    return item['permission'];
                })
                .join(',');
            console.log(891,fields)
            afuFacebookWebLogin.api(fields, facebookInfo => {
                console.log(JSON.parse(JSON.stringify(facebookInfo)));
                // 拿到登录用户的信息
                this.facebookInfo = facebookInfo;
            });
        });
    }
    //未登录
    else {
        //这里就是使用邮箱登录
        afuFacebookWebLogin.login((response) => {
            console.log(890, response)
        }, {
            scope: 'email',
            return_scopes: true
        })
    }
})

6、 通过 图谱 API 彻底取消授权应用或撤销登录

afuFacebookWebLogin.revocationAuthorization((response)=>{})