Devolución de llamada exitosa de inicio de sesión social

1. Haga clic para saltar a la autorización de terceros.

Insertar descripción de la imagen aquí

2. Esto es para utilizar gitee como autorización de verificación de terceros.

Insertar descripción de la imagen aquí

3. Si la autorización es exitosa, salte a redirigir_url

Insertar descripción de la imagen aquí

4. Lógica de devolución de llamada de inicio de sesión social

1. Obtener token según el método autorizado por el tercero.

(1) Enviar una solicitud para obtener el código (el código cambiará cada vez que se envíe una solicitud)

https://gitee.com/oauth/authorize?client_id={
    
    client_id}&redirect_uri={
    
    redirect_uri}&response_type=code

(2) Ensamble la URL de acuerdo con el código obtenido y envíe una solicitud POST para obtener la información del token

https://gitee.com/oauth/token?grant_type=authorization_code&code={
    
    code}&client_id={
    
    client_id}&redirect_uri={
    
    redirect_uri}&client_secret={
    
    client_secret}

(3) Obtener token de acceso

2. Determine si la información del token se obtuvo correctamente. Si el inicio de sesión autorizado por el tercero tiene éxito con el código exitoso, puede saltar directamente a la página de inicio. Si no se puede obtener la información del token, actualice la página de inicio de sesión.

(1) Si la información del token se obtiene correctamente, se elimina access_token
(2) Determine si es la primera vez que inicia sesión. Determine
si uid existe en la base de datos de miembros (uid debe usar access_token para consultar a terceros autorizados información del usuario)
Si el uid ya existe en la base de datos, significa que no. Cuando inicie sesión por primera vez, solo necesita actualizar el token de acceso (el token cambiará cada vez que inicie sesión y el tiempo de vencimiento es 1 día).
Si el uid no existe, significa iniciar sesión por primera vez y registrarse directamente. La información de registro se obtiene de un usuario externo autorizado. Obtener de información

/**
 * 处理社交登陆
 */
@Slf4j
@Controller
public class OAuth2Controller {
    
    

    @Autowired
    MemberFeignService memberFeignService;

    //http://auth.gulimall.com/oauth2.0/gitee/success?code=b43c71db8f207af30474f8331d76789c7cf705899ef7b276b7e60bb35c83cabd
    @GetMapping("/oauth2.0/gitee/success")
    public String oauth2(@RequestParam("code") String code) throws Exception {
    
    

        HttpResponse post = null;
        try {
    
    
            //https://gitee.com/oauth/token?grant_type=authorization_code&code={code}&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}
            Map<String,String> map = new HashMap<>();
            map.put("grant_type",Oauth2Constant.OAUTH2_GRANT_TYPE);
            map.put("code",code);
            map.put("client_id", Oauth2Constant.OAUTH2_CLIENT_ID);
            map.put("redirect_uri",Oauth2Constant.OAUTH2_RIDIRECT_URI);
            map.put("client_secret",Oauth2Constant.OAUTH2_CLIENT_SECRET);
            //String host, String path, String method,
            //Map<String, String> headers,
            //Map<String, String> querys,
            //Map<String, String> bodys
            post = HttpUtils.doPost("https://gitee.com", "/oauth/token", "POST", new HashMap<>(), map, new HashMap<>());
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }

        //取出token
        //获取状态行的响应码,如果是200就代表响应成功
        if (post.getStatusLine().getStatusCode() == 200){
    
    
            HttpEntity entity = post.getEntity();
            //将HttpEntity转换成String类型
            String entityJsonString = EntityUtils.toString(entity);
            //Json字符串 -> java对象  参数必须是String类型Json串
            SocialUser socialUser = JSON.parseObject(entityJsonString,SocialUser.class);

            //判断账号是否是第一次登陆,如果是第一次登陆就直接注册到会员服务
            R<MemberOAuthVo> r = memberFeignService.oauth2Login(socialUser);
            if (r.getCode() == 0){
    
    
                MemberOAuthVo memberOAuthVo = r.getData(new TypeReference<MemberOAuthVo>() {
    
    });
                log.info("用户信息:{}",memberOAuthVo);
                return "redirect:http://gulimall.com";
            }
        }else {
    
    
            //获取失败 -> 重定向到登录页
            return "redirect:http://auth.gulimall.com/login.html";
        }

        //第三方授权成功 -> 跳转至登陆页
        return "redirect:http://gulimall.com";

    }

}

Inscribirse

/**
     * 判断账号是否是第一次登陆
     */
    @PostMapping("/oauth2Login")
    public R<MemberEntity> oauth2Login(@RequestBody SocialUser socialUser) throws Exception {
    
    
        MemberEntity member = memberService.oauth2Login(socialUser);
        if(member != null){
    
    
            return R.ok().setData(member);
        }else {
    
    
            return R.error(BizCodeEnum.LOGINACCT_PASSWORD_INVALID_EXCEPTION.getCode(), BizCodeEnum.LOGINACCT_PASSWORD_INVALID_EXCEPTION.getMsg());
        }

    }
/**
     * 判断账号是否是第一次登陆
     * 1.查询uid(created_at) 是否存在,uid存在则表示不是第一次登陆,只需要更新access_token即可
     * 2.如果uid不存在,则查询第三方授权的用户信息,将用户信息、uid、access_token存入member服务
     * 3.返回MemberEntity
     */
    @Override
    public MemberEntity oauth2Login(SocialUser socialUser) throws Exception {
    
    
        //获取gitee授权用户的资料 https://gitee.com/api/v5/user
        //String host, String path, String method,
        //Map<String, String> headers,
        //Map<String, String> quer
        MemberEntity oatuthMemberEntity = null;
        String giteeId = null;
        String giteeName = null;
        try {
    
    
            Map<String,String> map = new HashMap<>();
            map.put("access_token",socialUser.getAccess_token());
            HttpResponse response = HttpUtils.doGet("https://gitee.com", "/api/v5/user", "GET", new HashMap<>(), map);
            oatuthMemberEntity = new MemberEntity();
            giteeId = "";
            giteeName = "";
            if (response.getStatusLine().getStatusCode() == 200){
    
    
                HttpEntity entity = response.getEntity();
                String s = EntityUtils.toString(entity);
                JSONObject jsonObject = JSON.parseObject(s);
                giteeId = jsonObject.getString("id");
                giteeName = jsonObject.getString("name");
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }

        //判断账号是否是第一次登陆
        MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper<MemberEntity>().eq("social_uid", giteeId));
        if (memberEntity != null){
    
    
            //uid存在,表示不是第一次登陆,则更新token即可
            MemberEntity member = new MemberEntity();
            member.setId(memberEntity.getId());
            member.setAccessToken(socialUser.getAccess_token());
            member.setExpiresIn(Long.toString(socialUser.getExpires_in()));
            this.baseMapper.updateById(member);
            //返回MemberEntity
            return memberEntity;
        }else {
    
    
            //查询为空表示是第一次登陆,根据第三方提供的api查询用户信息,然后注册
            oatuthMemberEntity.setSocialUid(giteeId);
            oatuthMemberEntity.setUsername(giteeName);
            oatuthMemberEntity.setCreateTime(new Date());
            oatuthMemberEntity.setAccessToken(socialUser.getAccess_token());
            oatuthMemberEntity.setExpiresIn(Long.toString(socialUser.getExpires_in()));
            this.baseMapper.insert(oatuthMemberEntity);
            return oatuthMemberEntity;
        }
    }

Supongo que te gusta

Origin blog.csdn.net/weixin_44847885/article/details/131352004
Recomendado
Clasificación