之前开发过facebook的第三方登录,网络上的资料很少,自己看官方的文档和查找一些资料开发了下,感觉过程有好多可避免的情况,在这里和大家分享一下。
facebook目前只支持oauth2技术,个人理解其工作流程是当用户想访问当前网站,却不想注册账号,此时当前网站有其它主流网站的第三方登录支持功能,即使用当前站的合作网站的账号密码去第三方合作网站验证用户的合法性,验证成功则允许登录当前站点,无需知道第三方的账号密码。
开发前需要先注册一个facebook的应用,这样可以得到类似密钥的两个值,client_id和client_secret,这两个值是访问facebook url的必要参数;
还要对应用进行一些必要的设置,首先要设置访问facebook和facebook回调的域名,并且配置下白名单,里面为ip值,多个逗号分隔,facebook会校验当前访问的域名解析后对应的ip是否在白名单里面;
接下来注意沙箱选项一定不要启用,否则会获取不到用户的信息,这样facebook应用基本设置完毕,该开始编写请求代码了。
上面了解了oauth2的工作流程,接下来一起看看其步骤和原理。
当用户点击第三方登录按钮时,会跳转出第三方网站(以下统称为服务端)的登录页面,输入用户名密码后客户端会向服务端申请一个临时令牌(即code值),申请成功后客户端还要申请授权(即token值),如果是第一次访问则会跳出授权页面,用户是否允许访问其一些基本信息,如name、email、用户的Id、图片等基本信息,如果验证及授权通过,则登录当前站点,并且下次会默认之前选择的授权不会弹出提示,除非清除本地cookie。
现在我们来编写代码,首先看下facebook oauth2的几个基本参数和访问url。
基本参数:
1、CLIENT_ID = 107717112397602 //为注册应用得到的值
2、redirectUrl = http://taiwan.tuangou.com/visitUrl/visitUrl //为facebook回调当前站点的url
3、SCOPE = "&scope=user_about_me,email,read_stream"; //表示取得的用户信息的权限范围
访问url:
1、REQUEST_CODE_URL //發送請求,得到Authorization Code
https://www.facebook.com/dialog/oauth?" + "client_id="+CLIENT_ID+"&redirect_uri="+redirectUrl+"&response_type=code"+SCOPE;
2、REQUEST_TOKEN_URL //請求token url
https://graph.facebook.com/oauth/access_token
3、REQUEST_USER_URL //使用得到的token獲取用戶信息
https://graph.facebook.com/me
在这并没有使用facebook的官方封装好的工具类,因为有了访问的url(由官方API提供),其实就是发送http请求和接受响应的过程,所以接下来只是编写http的过程。
代码1-controller中:
public void visitUrl(String code, @Param("origURL") String origURL){
try {
if (origURL != null && !"".equals(origURL)) {
this.origUrl = origURL;
}
//获得响应对象,可按照自己的方式获取
HttpServletResponse response = inv.getResponse();
if (code != null && !"".equals(code)) {
String token = NuomiOauthApi.getFacebookAccessToken(code);
if(token == null || "".equals(token)) {
response.getWriter().write("get code error...");
}else {
String[] tokens = token.split("&");
for (String t : tokens) {
if (t.indexOf("access_token") != -1) {
//此处有可能返回的值有多余的数据,可按照开发实际情况来决定是否处理 token = t.split("=")[1].trim();
}
}
//此处调用验证通过用户的基本信息 Map<String, String> map = getLoginUser(token);
if (map != null) {
//此处是判断是否本地已经有此用户,是否需要本地注册,可得到用户信息后自行开发 this.isLoginUserOldOrNew(inv, map, origUrl);
}else {
response.sendRedirect(INiuxConstants.DOMAIN_TW+origUrl);
}
}
}else {
////此处是第一次申请code值时
response.sendRedirect(requestCodeUrl);
}
} catch (Exception e) {
e.printStackTrace();
}
}
代码2-:
/**
* 使用Authentication Code方式獲取AcessToken
* @param authCode
* @return
* 如果出錯,返回null
*/
public static String getFacebookAccessToken(String authCode) {
try {
StringBuffer urlStr = new StringBuffer(REQUEST_TOKEN_URL);
urlStr.append('?');
StringBuffer temp = new StringBuffer();
temp.append("client_id=").append(CLIENT_ID).append('&')
.append("redirect_uri=").append(redirectUrl).append('&')
.append("client_secret=").append(CLIENT_SECRET).append('&')
.append("grant_type=authorization_code").append('&')
.append("code=" + authCode);
urlStr.append(temp.toString());
log.info("urlStr: "+urlStr);
String token = getFacebookTokenFromUrl(urlStr.toString(), null);
log.info("get token by authCode: "+token);
return token;
} catch (Exception ex) {
log.error("get AccessToken error:" + ex.getMessage(), ex);
return null;
}
}
代码3:
/**
* 通過api和token獲取當前登錄的用戶信息
* @param token
* @return
* map of id/name;如果出錯,返回null
*/
public static Map<String, String> getLoginUser(String token) {
try {
StringBuffer urlStr = new StringBuffer(REQUEST_USER_URL);
urlStr.append("?").append("access_token="+encodeUrl(token));
log.info("getLoginUser urlStr:"+urlStr.toString());
JSONObject json = getFacebookJsonFromUrl(urlStr.toString(), null);
log.info("getLoginUser json:"+json);
if (!json.containsKey("id")) {
if (json.containsKey("error_reason")) {
String errorReason = json.getString("error_reason");
String errorDescription = json.getString("error_description");
log.warn("save to facebook failed. errorReason:" + errorReason + ", errorDescription:"+ errorDescription);
}
} else {
Map<String, String> userInfo = new HashMap<String, String>();
userInfo.put("id", json.getString("id"));
userInfo.put("name", json.getString("name"));
userInfo.put("email", json.getString("email"));
userInfo.put("gender", json.getString("gender"));
return userInfo;
}
} catch (Exception e) {
// log it
log.error("get user info failed......", e);
e.printStackTrace();
}
return null;// error
}
代码4:
/**
* 從特定的url中獲取json
* @param urlStr
* @param params
* @return
* json object ,or null if failed
*/
private static JSONObject getFacebookJsonFromUrl(String urlStr, Map<String, String> params) {
HttpClient httpClient = new DefaultHttpClient();
//http請求好多都不支持post方式,但支持get
HttpGet httpGet = new HttpGet(urlStr);
JSONObject json = null;
try {
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
String aStr = IOUtils.toString(is);
json = JSONObject.fromObject(aStr);
} catch (Exception e) {
log.error("http client execute error:" + e.getMessage(), e);
}
return json;
}
以上就是整个开发的流程,还有几点需要注意:
1、发送请求的url中有个参数为回调url(即代码中的redirectUrl),此参数在请求code和token的时候值必须一致,否则无法得到授权
2、发送的url字符串应该encode一下,浏览器会自动解析
3、发送用户信息请求的时候,一定要用Get方式发送http请求
自己开发的总结,希望有所用处,谢谢!
分享到:
相关推荐
在iOS开发中,实现第三方登录通常会涉及到以下步骤: 1. **选择登录提供商**:首先,你需要确定支持哪些第三方平台。常见的有微信开放平台、QQ互联、微博开放平台,以及Facebook、Google的开发者平台。每个平台都有...
以上就是集成Facebook第三方登录的基本流程。Spring Social提供了一套完善的机制来简化这个过程,但实际开发中可能还需要根据应用需求进行定制,比如处理用户权限、缓存访问令牌、处理授权异常等。记得在开发过程中...
在Android应用开发中,集成第三方登录服务是一种常见的增强用户体验的方式,Facebook...这个过程需要对Android开发和Facebook SDK有一定理解,但遵循以上步骤,可以顺利地实现在你的应用中集成Facebook第三方登录功能。
google 谷歌第三方登录(facebook twitter 登录 第三方登录 web 可以参考,如果是oauth2.0协议 流程都是一样的)
在IT行业中,尤其是在Web开发领域,第三方登录是一种常见的功能,允许用户通过已有的社交媒体账号(如微信、QQ、微博或Google、Facebook等)登录到不同的网站和服务,为用户提供便利的同时,也降低了注册新账户的...
js集成了谷歌,facebook、韩国naver登录,填入自己在相应后台申请的开发应用ID即可。
总的来说,这个HTML5响应式第三方登录页面模板涵盖了前端开发的多个方面,包括HTML5语法、响应式布局、第三方登录集成和模板设计。学习并应用这些知识点,开发者可以创建出适应各种设备且用户体验优良的登录注册页面...
在iOS应用开发中,集成第三方登录服务已经成为一种常见的实践,为用户提供更加便捷的登录体验。标题"iOS第三方登录"指的是在iOS应用中整合如微信、QQ、微博等社交平台的登录方式,允许用户通过自己的社交账号快速...
掌握第三方登录接口的开发与集成,对于提升应用的用户友好性和效率至关重要。它不仅简化了用户操作,也减轻了开发者维护用户账户的负担,是现代互联网服务中不可或缺的一部分。在实际应用中,开发者应确保遵守各平台...
目前已支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、等等JAVA开发第三方授权登录的工具类...
理解和熟练运用这些库,将有助于开发出稳定、安全的第三方登录功能。在实际项目中,还需要结合具体的第三方登录提供商(如OAuth2、OpenID Connect等)的文档和SDK,按照其规定步骤进行操作,以完成完整的登录流程。
在移动应用开发中,尤其是Android平台上,为了提升用户体验和便捷性,开发者经常会选择集成第三方登录和分享功能。本文将详细讲解“安卓第三方登录分享集成SDK”的相关知识点,以及如何使用如`ShareSDK for Android`...
在移动应用开发中,尤其是iOS平台,为了提供用户便利,许多开发者选择集成第三方登录服务,如谷歌(Google)和脸书(Facebook)。这种方式允许用户使用他们已有的社交媒体账户快速注册和登录,而无需创建新的应用...
在Android应用开发中,接入第三方登录服务是一种常见的需求,它能提供用户更加便捷的登录体验。本示例主要关注的是微信登录以及分享功能的实现,这对于提升用户互动性和应用的社交化至关重要。以下是对这些知识点的...
第三方登录允许用户通过他们已经在其他知名平台(如微信、QQ、微博、谷歌或Facebook)建立的账户登录你的网站,无需创建新的账户。这种登录方式提高了用户便利性,因为他们不必记住多个网站的用户名和密码。实现这...