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 }