Login02

基于OAuth2.0协议的社交登陆

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。

微博登陆

登陆微博开放平台

创建应用,OAuth2.0 授权设置

授权回调页:
http://passport.gmall.com:8085/vlogin
取消授权回调页:
http://passport.gmall.com:8085/vlogout

获得自己的授权id和授权密钥

App Key:3013066497
App Secret:3c658b94d69d2abc69dcd37fdc5c1213

四个步骤

1 用户在passport认证中心准备登录时可以点击第三方社交登录按钮

跳转到

https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI

引导用户进入第三方网站的授权页面

1 https://api.weibo.com/oauth2/authorize?client_id=3013066497&response_type=code&redirect_uri=http://passport.gmall.com:8085/vlogin

2 用户在授权完成后,第三方网站将调用我们在第三方网站所创建的应用的回调地址,将授权码写入到我们的服务器中,网站需要将授权码保存到我们的数据库中

http://网站回调地址?code=fef987b3f9ad1169955840b467bfc661

1 code:42ab202b4d5236f13517467b32978dbc
2 
3 http://passport.gmall.com:8085/vlogin?code=42ab202b4d5236f13517467b32978dbc

3.通过授权码code发送post请求到第三方网站,换取access_token

https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI&code=CODE

4 在用户使用的过程中通过access_token获取用户数据(第三方网站的用户数据)

https://api.weibo.com/2/users/show.json?access_token=2.00S4TE5GH4psNBf534795d1677YqPB&uid=1

通过第三方社交登录的用户在本网站的信息需要补全,在该用户使用网站的级别高的功能时,要求用户补全信息甚至进行实名认证

 1 @RequestMapping("vlogin")
 2     public String vlogin(String code,HttpServletRequest request){
 3 
 4         //授权码换取accesstoken
 5 
 6         //client_id = 3013066497
 7         //client_secret = 3c658b94d69d2abc69dcd37fdc5c1213
 8         String s3 = "https://api.weibo.com/oauth2/access_token?";
 9         Map<String,String> paramMap = new HashMap<>();
10         paramMap.put("client_id","3013066497");
11         paramMap.put("client_secret","3c658b94d69d2abc69dcd37fdc5c1213");
12         paramMap.put("grant_type","authorization_code");
13         paramMap.put("redirect_uri","http://passport.gmall.com:8085/vlogin");
14         paramMap.put("code",code);// 授权有效期内可以使用,没新生成一次授权码,说明用户对第三方数据进行重启授权,之前的access_token和授权码全部过期
15         String access_token_json = HttpclientUtil.doPost(s3, paramMap);
16         Map<String,String> access_map = JSON.parseObject(access_token_json,Map.class);
17 
18 
19         //accesstoken获取用户信息
20         String uid = (String)access_map.get("uid");
21         String access_token = (String)access_map.get("access_token");
22 
23         String show_user_url = "https://api.weibo.com/2/users/show.json?access_token="+access_token+"&uid="+uid;
24         String user_json = HttpclientUtil.doGet(show_user_url);
25         Map<String,Object> user_map = JSON.parseObject(user_json,Map.class);
26 
27 
28         // 将用户信息保存数据库,用户类型设置为微博用户
29         UmsMember umsMember = new UmsMember();
30         umsMember.setSourceType("2");
31         umsMember.setAccessCode(code);
32         umsMember.setAccessToken(access_token);
33         umsMember.setSourceUid((String) user_map.get("idstr"));
34         umsMember.setCity((String)user_map.get("location"));
35         umsMember.setNickname((String)user_map.get("screen_name"));
36 
37         String g = "0";
38         String gender = (String) user_map.get("gender");
39         if (gender.equals("m")){
40             g = "1";
41         }
42         umsMember.setGender(g);
43 
44 
45         //将用户信息保存数据库,用户类型设置为微博登陆
46         UmsMember umsCheck = new UmsMember();
47         umsCheck.setSourceUid(umsMember.getSourceUid());
48 
49         UmsMember umsMemberCheck = userService.checkOauthUser(umsCheck);
50 
51         if (umsMemberCheck == null){
52             userService.addOauthUser(umsMember);
53         }else {
54             umsMember = umsMemberCheck;
55         }
56         //生成jwt的token,重定向到首页,携带该token
57         String token = null;
58         String memberId = umsMember.getId();
59         String nickname = umsMember.getNickname();
60         Map<String,Object> userMap = new HashMap<>();
61         userMap.put("memberId",memberId);
62         userMap.put("nickname",nickname);
63 
64 
65         String ip = request.getHeader("x-forwarded-for");// 通过nginx转发的客户端ip
66         if(StringUtils.isBlank(ip)){
67             ip = request.getRemoteAddr();// 从request中获取ip
68             if(StringUtils.isBlank(ip)){
69                 ip = "127.0.0.1";
70             }
71         }
72 
73         // 按照设计的算法对参数进行加密后,生成token
74         token = JwtUtil.encode("2019gmall0105", userMap, ip);
75 
76         // 将token存入redis一份
77         userService.addUserToken(token,memberId);
78 
79         return "redirect:http://search.gmall.com:8083/index?token="+token;
80 
81     }

userServiceImpl

 1     @Override
 2     public UmsMember checkOauthUser(UmsMember umsCheck) {
 3         UmsMember umsMember = userMapper.selectOne(umsCheck);
 4         return umsMember;
 5 
 6     }
 7 
 8     @Override
 9     public UmsMember getOauthUser(UmsMember umsMemberCheck) {
10 
11 
12         UmsMember umsMember = userMapper.selectOne(umsMemberCheck);
13         return umsMember;
14     }
原文地址:https://www.cnblogs.com/quyangyang/p/11626864.html