java 微博第三方登录_java第三方登录(微博,QQ)详细代码

第三方登录,首先需要设计扩展性的表结构。参照如下:本文主要写第三方登录的代码。

浅谈数据库用户设计:http://www.cnblogs.com/jiqing9006/p/5937733.html

可绑定可扩展的账号系统:http://blog.cocosdever.com/2016/03/08/The-design-principle-and-implementation-of-extensible-account-system-1/

第三方登录流程是:先获取code---->然后获取access_token----->根据token获取用户信息。

前台页面实现步骤:点击微博登录按钮---->打开一个子窗口,进行授权------>授权完成,跳转到首页或上次浏览的页面。

1、写第三方登录的按钮,点击按钮时,打开一个子窗口。

redirect_uri是你在微博上设置的回调地址。

Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>

My JSP 'index.jsp' starting page

varqqAuthWin,weiboAuthWin;/**

* 关闭QQ子窗口*/

functioncloseQQWin(){varresult=$("#qq").val();if(result!= ""){

console.log(result);

qqAuthWin.close();

}else{

console.log("值为空");

}

}/**

* QQ登录

* http://localhost:9090/logback/qq.jsp QQ互联上设置的回调地址*/

functionloginQQ(){

qqAuthWin=window.open("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=CLIENT_ID&state=register&redirect_uri=http://localhost:9090/logback/qq.jsp",'QQ授权登录','width=770,height=600,menubar=0,scrollbars=1,'+

'resizable=1,status=1,titlebar=0,toolbar=0,location=1');

}/**

* 关闭微博子窗口*/

functioncloseWeiboWin(){varresult=$("#weibo").val();if(result!= ""){

console.log(result);

weiboAuthWin.close();

}else{

console.log("值为空");

}

}/**

* 微博登录

* http://localhost:9090/logback/weibo.jsp这个就是在微博上设置的回调地址*/

functionloginWeibo(){

weiboAuthWin=window.open("https://api.weibo.com/oauth2/authorize?client_id=CLIENT_ID&response_type=code&state=register&redirect_uri=http://localhost:9090/logback/weibo.jsp",'微博授权登录','width=770,height=600,menubar=0,scrollbars=1,'+

'resizable=1,status=1,titlebar=0,toolbar=0,location=1');

}

QQ登录


微博登录

2、回调地址页(qq.jsp、weibo.jsp)

Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";Stringcode=request.getParameter("code");//获取QQ返回的codeStringstate=request.getParameter("state");%>

">

My JSP 'weibo.jsp' starting page

$.ajax({

url:"http://localhost:8080/cms_manage/api/qqLogin",

type:"post",

data:{code:code,state:state},

dataType:"json",

success:function(result){

result=JSON.stringify(result);

console.log(result);//把返回的数据传给父窗口的隐藏域中

window.opener.document.getElementById("qq").value=result;//授权完成后,关闭子窗口

window.opener.closeQQWin();

}

});

});

qq.jsp和weibo,jsp是一样的。。。

3、java代码

/**

* 微博第三方登录

* @author techbuddy

*

*/

@Controller

public class WeiboLoginController {

private Logger logger = Logger.getLogger(WeiboLoginController.class);

private final static String CLIENT_ID = "";

private final static String CLIENT_SERCRET = "";

private final static String GET_TOKEN_URL = "https://api.weibo.com/oauth2/access_token";

private final static String REDIRECT_URI = "http://localhost:9090/logback/weibo.jsp";

private final static String GET_USER_INFO = "https://api.weibo.com/2/users/show.json";

private final static String GET_TOKEN_INFO_URL = "https://api.weibo.com/oauth2/get_token_info";

private final static String STATE = "register";

@RequestMapping(value="/api/weiboLogin",method=RequestMethod.POST)

@ResponseBody

public CMS_Result weiboLogin(HttpServletRequest request,HttpServletResponse response){

CMS_Result result = null;

String error_code = request.getParameter("error_code");

if(StringUtils.isNotBlank(error_code)){

result = CMS_Result.bulid("5001", "微博授权失败");

}else{

try{

//获取code

String code = request.getParameter("code");

logger.info("code:" + code);

//获取state

String state = request.getParameter("state");

logger.info("state:"+state);

String access_token = "";

String expires_in = "";

String uid = "";

if(STATE.equals(state)){

//获取token

JSONObject token = getAccessToken(code);

access_token = token.getString("access_token");

uid = token.getString("uid");

expires_in = String.valueOf(token.getInt("expires_in"));

logger.info("token:"+token);

}else{

result = CMS_Result.bulid("5001", "微博授权失败");

}

//查询该用户信息

OauthUser oauthUser = oauthUserService.findWeiboByIdentifier(uid);

Master master = null;

if(oauthUser != null){

master = masterInfoDao.findById(oauthUser.getMaster_id());

}else{

//获取用户信息

JSONObject userInfo = getUserInfo(access_token, uid);

logger.info("用户信息"+userInfo);

String nickname = userInfo.getString("screen_name");

String profile_image_url = userInfo.getString("profile_image_url");

String gender = "f".equals(userInfo.getString("gender"))?"1":"0";

//向第三方登录表中添加数据

OauthUser user = new OauthUser();

user.setId(UUID.randomUUID().toString());

String master_id = UUID.randomUUID().toString();

user.setMaster_id(master_id);

user.setIdentity_type("weibo");

user.setIdentifier(uid);

user.setCredential(access_token);

user.setExpires_in(expires_in);

user.setStatus("0");

oauthUserService.insert(user);

//向用户表中添加默认数据

Master masterUser = new Master();

masterUser.setId(master_id);

masterUser.setNickname(nickname);

masterUser.setHead_portrait(profile_image_url);

masterUser.setSex(gender);

//由于第三方登录没有用户名密码,而且该字段在数据库中不为空,在此设置默认用户名密码

masterUser.setUser_name("wbu"+access_token.substring(0, 9));

masterUser.setPassword("wbp"+access_token.substring(0, 9));

masterInfoService.insertDefault(masterUser);

master = masterUser;

}

result = CMS_Result.ok();

}catch (Exception e) {

e.printStackTrace();

result = CMS_Result.bulid("5001", "登录失败");

}

}

return result;

}

/**

* 获取AccessToken

*/

private JSONObject getAccessToken(String code) {

StringBuilder sb = new StringBuilder();

sb.append("grant_type=authorization_code");

sb.append("&client_id=" + CLIENT_ID);

sb.append("&client_secret=" + CLIENT_SERCRET);

sb.append("&redirect_uri=" + REDIRECT_URI);

sb.append("&code=" + code);

String result = HttpsUtil.post(GET_TOKEN_URL,sb.toString());

/**

* 返回数据

* {

*"access_token": "ACCESS_TOKEN",

*"expires_in": 1234,

*"remind_in":"798114",

*"uid":"12341234"

*}

*/

JSONObject json = new JSONObject(result);

return json;

}

/**

* 获取用户信息

* @param access_token

* @param uid 查询的用户ID

* @return

*/

private JSONObject getUserInfo(String access_token,String uid){

StringBuilder sb = new StringBuilder();

sb.append("?access_token=" + access_token);

sb.append("&uid=" + uid);

String result = HttpsUtil.get(GET_USER_INFO+sb.toString());

//返回参数:查看http://open.weibo.com/wiki/2/users/show

JSONObject json = new JSONObject(result);

return json;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值