zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    OCP-1Z0-051-V9.02-162题
    OCP-1Z0-051-V9.02-161题
    OCP-1Z0-051-V9.02-160题
    Matlab中矩阵的分解
    OCP-1Z0-051-V9.02-158题
    OCP-1Z0-051-V9.02-157题
    Matlab中特殊的矩阵函数
    求Matlab中矩阵的秩和迹
    Matlab中的条件数
    在android里使用boost c++
  • 原文地址:https://www.cnblogs.com/quyangyang/p/11626864.html
Copyright © 2011-2022 走看看