简述

最近项目中有关于第三方登陆的需求,第三方Facebook以及Google +登录。

正好这几天把这个需求做得差不多了,收个尾,作为一个这方面之前基本从未涉及的小白,总结下开发流程以及过程中遇到的一些问题。希望能对大家有所帮助。

基本上,目前互联网上的涉及到第三方登录采用的都为OAuth认证方式,相关原理以及实现方法相关的可以网上搜索查看。不过涉及到Facebook以及Google +的登陆,最大的问题是这两个网站在墙外,想翻墙找资料比较费劲,奈何国内这方面的资料也不是很齐全,翻到的官方的文档又全是英文的,阅读无能~

第三方登陆简单可以分为以下几个步骤,分别是:获得第三方登陆许可认证根据规范添加页面登录样式和js实现,跳转到第三方登陆页面登陆并获取授权后,返回原指定页面(或请求)后台对登录信息进行校验,并获取对应第三方登陆用户的信息将第三方用户信息与本系统用户进行关联

下面就以上几个步骤的一些关键信息,或者说是我开发当中遇到的问题做一下简要的记录。因为Facebook以及Google +第三方登陆都采用的是Auth2技术,因此只会在具体实现不同的地方单独说明。理解有误的地方,或者是没有说全的地方,还请各位谅解~

一 获得第三方登陆许可认证

在获取许可上,需要在对应的开发平台上申请登陆接入许可,基本上你可能需要准备以下几样东西:

  • 你当前需要接入第三方登陆的网址域名(用于第三方平台校验是否这个登录请求来自于你的网站本身);
  • 给用户展示的网站logo和文字(用于在第三方登陆的时候给用户直观的展(装)示(逼));
  • 登陆成功后,跳回的URL(用于获取并使用登陆用户的相关信息);

申请成功之后,第三方平台会提供给你对应的AppID以及AppSecret,用以后台进行额外的操作。基本上操作按照官方api的顺序一步一步来就可以了惹,这里就不再赘述了~(请掌握基本的英语阅读能力…)

二 根据规范添加页面登录样式和js实现

简单点讲就是在页面上添加登录Button,并通过点击触发跳转到第三方的请求。Google+以及Facebook在大体上逻辑一致,在细节上实现略有不同。

       Google+登录。会引用自己封装的js(<script src="https://apis.google.com/js/platform.js" defer async="true"></script>)来实现登录操作(gapi),并提供了多种登陆实现方案可供选择。这里贴一下,我目前项目中实现的方案,仅供参考。

1.在对应页面引用Google第三方js。https://apis.google.com/js/api:client.js(这里的js其实和官方最新的platform.js内容是一样的…吧~)

2.页面定义Google+登录的按钮样式(这里谷歌有内置的规范按钮样式可以直接调用,不用自己定义)

(id="googleLogin")

3.根据引用的第三方js提供的api,作如下初始化操作:

auth2 = gapi.auth2.init({
client_id: clientID, //第一步申请的时候,提供给你的appid
cookiepolicy: 'single_host_origin',
scope: 'https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/userinfo.email' //需要获取的用户信息领域
});

4.初始化后,接着需要对你定义的按钮绑定鼠标点击事件,作如下操作:

auth2.attachClickHandler('googleLogin',{},startApp.onSuccess,startApp.onFailure); //googleLogin为按钮的ID

5.做完这些之后就等用户点击(上钩)啦~这里需要注意下startApp.onSuccess以及startApp.onFailure方法,这里是在谷歌成功登陆之后的回调函数。在onSuccess里第三方已经登录并返回,我们已经可以根据接口api获取想要的用户信息了,而在onFailure里因为登录失败,我们可以自定义一些提示信息。

6.等等!上面代码中的变量都是干嘛用的啊喂~别慌,下面附上完整的js!项目开发使用了RequireJs,代码仅供参考!

  
define("glogin", ['google', 'jquery'], function(google, $) {

    var startApp = {};
var googleUser = {}; var clientID = "#your AppID#"; startApp.onSuccess = function(googleUser) {
var profile = googleUser.getBasicProfile();
var authProfile = googleUser.getAuthResponse(); var userName = profile.getName();
var userImage = profile.getImageUrl();
var userEmail = profile.getEmail();
var idToken = authProfile.id_token; var flag = true; if (userEmail && idToken) {
$.ajax({
url: "/action.do",
data: {
userName: userName,
firstName: userName,
lastName: userName,
email: userEmail,
idToken: idToken,
userType: '3'
},
dataType: "json",
tyep: "post",
success: function(data) {
if (data.success == true) {
window.location.reload(true);
} else {
flag = false;
}
} });
} if (!flag) {
alert.alert("XXX.");
}
}; startApp.onFailure = function(error) {
console.log(error);
alert.alert("XXX.");
}; startApp.init = function() {
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: clientID,
cookiepolicy: 'single_host_origin',
scope: 'https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/userinfo.email'
}); auth2.attachClickHandler('googleLogin', {}, startApp.onSuccess, startApp.onFailure);
});
}; return startApp;
}); require(["glogin"], function(main) {
main.init();
});

       Facebook登录。同样会调用自己封装的js(<script src="https: //connect.facebook.net/en_US/sdk.js" defer async="true"></script>)来实现登录操作(FB),实现步骤基本同Google+登陆类似。

1.在对应页面引用Facebook第三方js。https: //connect.facebook.net/en_US/sdk.js;

2.页面定义Facebook登录的按钮样式

(id="fblogin")

3.根据引用的第三方js提供的api,作如下初始化操作:

 
FB.init ({
appId : '#your AppID#',
cookie : true,
xfbml : true,
version : 'v2.4'
});

4.初始化后,接着需要对你定义的按钮绑定鼠标点击登录事件,作如下操作:

 
$("#fblogin").click(function (){
FB.login(function(response) {
statusChangeCallback(response); //登录回调函数
},{scope: 'email'}); //需要获取的信息scope
});

5.statusChangeCallback为登录回调函数,需要在里面做下登陆返回的相关操作:

 
var statusChangeCallback = function (response){
if (response.status === 'connected') {
var accessToken = response.authResponse.accessToken; //取得 accessToken FB.api('/me?fields=name,first_name,last_name,email', function(response) { // /me为API指定的调用方法,用于获取登陆用户相关信息
if(response.email!=null){
$.ajax({
url:"/action.do",
data:{
userName:response.name,
firstName:response.first_name,
lastName:response.last_name,
email:response.email,
idToken:accessToken,
userType:'2'
},
dataType:"json",
tyep:"post",
success:function(data){
if(data.success == true){
window.location.reload(true);
}
}
});
}else{
alert("XXX.");
}
});
}
};

更详细的接口以及实现请参考最下面提供的官方API链接!多读读就懂了!

三 后台对登录信息进行校验,并获取对应第三方登陆用户的信息

在用户正确的登录第三方平台并进行授权之后,调用返回函数,这时需要对用户的登录信息和状态进行确认!这里非常关键,因为要确保用户的确是从对应第三方平台登录,而不是随随便便敲一个URL就能让请求通过了。所以我们需要第三方平台提供的access_token值,根据约定好的校验规则进行校验,放行校验通过的登陆请求。

由于验证信息涉及到app的隐私信息,以及确保验证不会被人为的篡改,因此需要在服务器后端进行token的验证。

参见第二条相关js实现,在第三方调用返回函数之后,代码中会进行ajax请求,调用后台的对应接口 /action.do,来在后台进行access_token的正确性判断。

后台会根据登陆的第三方类型,进行https请求验证,来确保用户登陆的信息无误。

Google+的token验证地址:https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XXX

Google+的token验证通过返回的Json格式(校验aud是否与后台保存的AppId匹配):


{
"iss": "https://accounts.google.com",
"sub": "110169484474386276334",
"azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"email": "billd1600@gmail.com",
"at_hash": "X_B3Z3Fi4udZ2mf75RWo3w",
"email_verified": "true",
"aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
"iat": "1433978353",
"exp": "1433981953"
}
 

Facebook的token验证地址(%7C为encode的 '|'符号):https://graph.facebook.com/debug_token?access_token={Your AppId}%7C{Your AppSecret}&input_token=XXX

Facebook的token验证通过返回的Json格式("is_valid": true):

{
"data": {
"app_id": 000000000000000,
"application": "Social Cafe",
"expires_at": 1352419328,
"is_valid": true,
"issued_at": 1347235328,
"scopes": [
"email",
"publish_actions"
],
"user_id": 1207059
}
}

因为这里后台采用JAVA开发,在验证地址为HTTPS请求验证的时候,后台利用HttpClient请求的时候涉及到证书验证的问题,所以这里采用了 @rongyongfeikai2同学的方法:《JAVA利用HttpClient进行POST请求(HTTPS》,有需求的可以参考借鉴。

后台根据对应官方的api文档的token校验方式,对获取到的token进行校验。如果请求的验证地址返回的信息为校验通过,则可以进行后面的操作了。

四 将第三方用户信息与本系统用户进行关联

在进行前端js请求的时候,对应平台的api接口会获取到用户的信息(参照上述代码)。与此同时,在进行用户token校验的时候,返回的对应json对象中也会包含对应的用户信息,这些信息可以在后台进行解析和获取,详细的数据结构可以参考官方文档。为了确保用户信息不会被中途截断篡改,可以在后台进行数据获取。

在获取到第三方登录用户的信息之后,就可以与本系统的账户进行匹配操作了。之后的操作存在几种不同的方式类型,对于本系统来讲,采用的是以下鉴定流程。

后叙

以上为目前我们系统中的第三方登录的基本实现方案,也许并不太完整(毕竟基本上之前没怎么涉及过…),但是希望其中的涉及到的点能够帮助到大家,也希望大家能指出写的不对的地方,并多多包涵哈。

PS:第一次写博客,不知道该怎么下手,明明脑子里想的很多,一写动笔就不知道该写什么好惹……

以下为开发过程中参考的文章地址,有需求的朋友可以自行点击查阅!

Google+登录api:https://developers.google.com/identity/sign-in/web/devconsole-project

Google+自定义button:https://developers.google.com/identity/sign-in/web/build-button

Google+ token验证:https://developers.google.com/identity/sign-in/web/backend-auth

Facebook登录api:https://developers.facebook.com/docs/facebook-login?locale=zh_CN

Facebooktoken验证 api:https://developers.facebook.com/docs/facebook-login/access-tokens/debugging-and-error-handling

Facebook token验证解决方案:http://stackoverflow.com/questions/19359868/how-would-you-perform-debug-token-call-using-facebook-php-sdk

后台https地址请求解决方法:http://blog.csdn.net/rongyongfeikai2/article/details/41659353

关于Google+以及Facebook第三方登录实现的一点总结的更多相关文章

  1. java网站如何集成facebook第三方登录

    第一次接触Facebook第三方登录,可能有些地方做的并不全面,只是尝试着做了一个小demo,因为国内接入Facebook的项目并不多,并且多数都是Android或iOS的实现,所以资料也特别少,在此 ...

  2. android开发学习——facebook第三方登录,看了你不会后悔

    给APP用原生android进行facebook第三方登录. 我们做一件事情,首先得了解其原理,这样才不会迷茫,才知道自己做到什么程度了,心里才会有底. 所以,第一步,了解第三方登录的原理:下面贴一些 ...

  3. 用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录

    目录 目录 前文列表 扩展阅读 第三方登录流程 OAuth 应用 OAuth 实现 Facebook 第三方登录 实现效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask ...

  4. swift-sharesdk集成微信、Facebook第三方登录

    好久没有写博客了.最近忙得没有时间更新博客,很忙很忙. 今天就把自己做过的第三方集成和大家分享一下,请大家多多指教. 第一步: 一.获取AppKey(去官方平台注册) 二.下载SDK 三.快速集成 第 ...

  5. facebook第三方登录

    一:创建和配置开发者应用 https://developers.facebook.com 登录开发者(可能要手机验证,身份证严重)->创建应用(web )->填写配置,网站网址和应用域名需 ...

  6. 使用ShareSDK完成Facebook第三方登录和Facebook分享时没办法跳转到Facebook应用

    楼主是通过cocoapod接入ShareSDK, 后来发现无论是使用fb分享还是登录, 都是跳出了网页认证(即使我的手机有安装了fb) 后来mob的技术客服小哥告诉我在构造分享参数的时候, 执行参数字 ...

  7. 分享前端Facebook及Twitter第三方登录

    最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...

  8. 网站如何集成Facebook和Twitter第三方登录

    最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...

  9. 第三方登录 (faceBook )

    1.iOS 第三方登录(Facebook,Twitter...)http://www.jianshu.com/p/f64d5ad2ef2a

随机推荐

  1. Android Virtual Devices代理上网

    本机电脑是使用代理上网,然后要在avd中要连接互联网,设置步骤如下: Click on Menu Click on Settings Click on Wireless & Networks ...

  2. POJ C++程序设计 编程题#1 编程作业—STL1

    编程题#1 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面的程序输出结 ...

  3. ARC————自动引用计数

    一.内存管理/引用计数 1.引用计数式内存管理的方式(下面四种) 对象操作 OC方法 生成并持有对象 alloc/new/copy/mutableCopyd等方法 持有对象 retain方法 释放对象 ...

  4. Cookie与Session的一些总结

    一.Cookie: Cookie主要存储一些不敏感的数据,只能存储字符串类型 执行过程: (1)第一次请求: 客户端将数据(比如用户名)以请求报文的形式请求服务器端响应, 服务器端得到数据(用户名), ...

  5. c# 加密/解密 哈希

    DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么 ...

  6. 一款jQuery满屏自适应焦点图切换特效

    一款jQuery满屏自适应焦点图切换特效 ,自适应当前浏览器的宽度,可以作为网站整个大背景的却换效果,很不错的一款不jquery特效. 兼容性没的说直接秒杀了IE6.适用浏览器:IE6.IE7.IE8 ...

  7. WIN7 X64 解决无法安装IE11,以及无法点击微软升级包MSU的问题

    一般在官方下载的文件是MSU格式的后缀文件,这个文件属于系统升级包补丁:下载完毕之后直接点击安装会报错,错误提示如下:安装程序遇到错误:0x80070422 无法启动服务,原因可能是已被禁用或与其相关 ...

  8. System.Transaction (TransactionScope) 与 可提升 (Promotable) 交易

    这是我的备份,原文请看  http://www.dotblogs.com.tw/mis2000lab/archive/2014/11/12/transactionscope_promotable_tr ...

  9. Ruby Code Style

    这篇博文逐渐写一点关于Ruby的编码风格,主要参考ruby-stytle-guide. 一些命名准则 函数与变量 使用蛇形小写比较好:some_var, some_function 目录和文件也使用s ...

  10. CentOS6.4上搭建hadoop-2.4.0集群

    公司Commerce Cloud平台上提供申请主机的服务.昨天试了下,申请了3台机器,搭了个hadoop环境.以下是机器的一些配置: emi-centos-6.4-x86_64medium | 6GB ...