`
dengzhouit
  • 浏览: 13186 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Spring MVC实现QQ第三方登录

阅读更多

首先得申请相应的应用 ID和key值。地址 是:http://connect.qq.com/intro/login/

 

下面是登录过程演示如图:

QQ登录

然后点击登录如下图所示:

QQ登录

 

这已经是地个绑定好关联账号的登录了。那么我们怎么用Spring mvc实现呢?

code
1
2
3
4
5
6
7
8
9
10
11
12
/**
* qq登录页面
* @param session
* @param map
* @return
* @throws IOException
*/
@RequestMapping("qq/login")
public String qqLoginUrl(HttpSession session,ModelMap map) throws IOException{
OauthConfig oc=oauthService.getOauthConfig("qq");
return "redirect:"+String.format("%s?response_type=code&client_id=%s&redirect_uri=%s",oc.getAuthorizeUrl(),oc.getClientId(),oc.getRedirectUri());
}

这是一个验证过程,需要qq的authorize url和client_id以及跳转地址redirecturi。authorize url地址的参数是什么,详细请看qq登录的第三方API文档那里有地址。client_id这个是你申请后有的。跳转地址这个重要,如果在没有绑定账号情况下需要跳转到邦定的页面如图:

QQ绑定页面

我这里做了注册绑定和已有账号绑定,所以需要提供2种情况。下面看验证过程代码。

 

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
* qq登录数据验证
* @param code
* @param map
* @param session
* @param request
* @return
*/
@SuppressWarnings("unchecked")
@RequestMapping("qq/authorizationCode")
public String qqAuthorizationCode(String code,ModelMap map,HttpSession session,HttpServletRequest request){
if(session.getAttribute("openId")==null){
OauthConfig oc=oauthService.getOauthConfig("qq");
//String clientId=systemConfigService.getByVarName("cms_qqClientId", 0).getValue();
//String suffix=systemConfigService.getByVarName("core_dynamicSuffix", 0).getValue();
String url=String.format("%s?grant_type=authorization_code&client_id=%s&client_secret=%s&code=%s&state=%s&redirect_uri=%s",oc.getTokenUrl(),oc.getClientId(),oc.getClientSecret(),code,UUID.randomUUID().toString(),oc.getRedirectUri());
DefaultHttpClient httpclient = HttpClientUtils.getHttpClient();
Map<String,String> obj=null;
//String client_id=null;
String openid=null;
try {
String request_token = HttpClientUtils.getHtml(httpclient, url, "UTF-8");
System.out.println(request_token);
// if(request_token.indexOf("\"error\"")>=0){
// return "redirect:login"+suffix;
// }
HashMap<String, String> access_token = ParseString.parseTokenString(request_token);
String url2=String.format("%s?access_token=%s",oc.getMeUrl(),access_token.get("access_token"));
String s = HttpClientUtils.getHtml(httpclient, url2, "UTF-8");
openid=s.substring(s.indexOf("\"openid\":\"")+10,s.indexOf("\"}"));
String url3=String.format("https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s",access_token.get("access_token"),oc.getClientId(),openid);
System.out.println(HttpClientUtils.getHtml(httpclient, url3, "UTF-8"));
obj=JsonUtil.conventJsonToObject(HttpClientUtils.getHtml(httpclient, url3, "UTF-8"), Map.class);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// if(qqObj.getRet()!=0){
// throw new MessageException(300,"出现异常新重新登陆");
// }
map.addAttribute("w",webConfigDAO.findById("1"));
if(oauthService.getByOpenId(openid,1)!=null){
try {
if(oauthService.oauthLogin(openid,1, session,request)){
return "/WEB-INF/cms/system/member/loginCallback.html";
}
} catch (MessageException e) {
// TODO Auto-generated catch block
e.printStackTrace();
map.addAttribute("msg", e.getMessage());
return"/WEB-INF/cms/system/member/memberError.html";
}
}
session.setAttribute("openId", openid);
session.setAttribute("loginType", 1);
session.setAttribute("userInfo",new String[]{obj.get("nickname"),obj.get("gender"),obj.get("figureurl_1"),obj.get("figureurl_2")});
}else{
session.removeAttribute("openId");
session.removeAttribute("loginType");
session.removeAttribute("userInfo");
}
return "/WEB-INF/cms/system/member/oauthPage.html";
}

用DefaultHttpClient类进行访问验证的页面,我们需要以下参数

 

 

Step1:获取Authorization Code

 

如果用户成功登录并授权,则会跳转到指定的回调地址,并在redirect_uri地址后带上Authorization Code和原始的state值

 

Step2:通过Authorization Code获取Access Token

 

这里是参数,大家可以结合上面的代码分析。

如果成功返回,即可在返回包中获取到Access Token。
返回如下字符串:access_token=FE04************************CCE2&expires_in=7776000&state=test 。

上面的代码url3主要是获取key和value存到map对你里面。然后通过freemarker框架来调用从qq那里得到的数据展示到页面。

那我们的数据库设计呢,我们只需要下面几个就行。

只需要一个qq返回的一个唯一ID值存到数据库然后在存会员的ID即可完成邦定。通过ID找到会员ID,在通过会员ID找到相应的会员。

好了教程就说到这里,有不懂的可以下载微骏CMS查看相应的代码以及数据库脚本。

登录表的结构如下:http://www.vijun.com/reference/vj_database/table/vj_oauth.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics