社交登陆成功回调

news/2024/11/29 17:34:31/

1. 点击跳转至第三方授权

在这里插入图片描述

2. 这是使用gitee作为第三方授权进行验证

在这里插入图片描述

3. 授权成功则跳转至 redirect_url

在这里插入图片描述

4. 社交登陆回调逻辑

一、根据第三方授权提供的方式获取token

(1)发送请求获取code码(每次发送请求,code码会改变)

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

(2)根据获取的code码拼装url,发送POST请求获取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)获取access_token

二、判断token信息是否获取成功,获取成功代码第三方授权登陆成功,可以直接跳转至主页,获取失败则刷新登陆页

(1)获取token信息成功,则取出access_token
(2)判断是否是第一次登陆
通过判断会员数据库是否存在uid(uid需要使用access_token查询第三方授权的用户信息)
如果uid已存在数据库中则表示不是第一次登陆,则只需更新access_token即可(token每登录一次会改变,并且过期时间为1天)
如果uid不存在,则表示第一次登陆,直接进行注册,注册信息从第三方授权用户信息中获取

/*** 处理社交登陆*/
@Slf4j
@Controller
public class OAuth2Controller {@AutowiredMemberFeignService 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> bodyspost = 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";}}

会员注册

/*** 判断账号是否是第一次登陆*/@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*/@Overridepublic 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> querMemberEntity 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);//返回MemberEntityreturn 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;}}

http://www.ppmy.cn/news/535509.html

相关文章

应用计算机散热的原理是什么,笔记本电脑散热原理与CPU降频技术解析

笔记本电脑的散热技术 随着电脑技术整体性能的提高,各部件的运行频率也越来越高,功耗随之加大,散热成了一个很关键的技术问题。 热量的排放关系着整个系统的稳定性及产品的使用寿命。尤其是对笔记本电脑及一些小型的移动终端产品,有效的散热有着非常重要的意义。下面我们就…

Barsetto百胜图美式全自动磨豆咖啡机评测,最轻松美式现磨体验

爱喝美式咖啡的人也许是因为它简单纯粹&#xff0c;也许是因为它股骨子里的随性&#xff0c;而作为爱美人士的我喜欢美式咖啡是因为它有一定的减肥效果。美式咖啡讲究萃取&#xff0c;在味道上独具一格&#xff0c;风味独特&#xff0c;现代年轻人甚至把它看作是一种时尚潮流。…

商用咖啡机 推荐.html,商用咖啡机推荐,半自动咖啡机如何使用?

人们的品味高了,这样就有好多人都喜欢买咖啡机,在买咖啡机的时候大家就都盲目了,不知道应该要选择什么样的,尤其是现在咖啡机的种类和价格也都的混乱,那么商用咖啡机推荐有哪些,以及半自动咖啡机如何使用? 一、商用咖啡机推荐: 1、咖啡店、咖啡吧,意大利传统手动咖啡机是各个商…

java咖啡机故障5_有效解决咖啡机常见故障的方法「推荐」

有效解决咖啡机常见故障的方法「推荐」 对于喜欢喝咖啡的人来说,要是咖啡机坏了,那可是件麻烦事,总会感觉生活缺了点什么。下面&#xff0c;小编为大家分享有效解决咖啡机常见故障的方法&#xff0c;希望对大家有所帮助! 1.把手滤网不出咖啡或者冲煮头喷气、机器发生噪音 可能存…

Barsetto百胜图美式全自动磨豆咖啡机,好“咖”多磨

好的咖啡需要精挑细选的咖啡豆&#xff0c;而好的咖啡豆则需要精细研磨&#xff0c;才能释放出最大的香气与潜能。不同的研磨会让咖啡的层次变得更丰富&#xff0c;所给予人的美好体验感也是不一样的&#xff0c;所以我们需要一台好的磨豆咖啡机来解决这些专业的问题。 一个咖啡…

020、备份与恢复原理和实操

备份与恢复原理和实操 备份pg_basebackup 备份原理日志设置数据库的状态备份原理pg_start_backupbackup_lable 文件backup_lable 文件示例pg_stop_backup备份方式1:pg_start_backup备份方式2:pg_basebackup完全恢复数据库恢复流程数据库完全恢复示例timelineID(时间线)时间线Ti…

利用人工神经网络在Abaqus中实现本构模型的网格粗化计算框架:详细指南与实践

引言 亲爱的读者朋友们&#xff0c;大家好&#xff0c;我在此篇文章中&#xff0c;将为大家详细介绍如何在Abaqus中实现基于人工神经网络&#xff08;Artificial Neural Network, ANN&#xff09;的本构模型以进行网格粗化的计算框架。我们将一步步地学习和探索这个过程&#…

Java-API简析_java.lang.SecurityException类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131352825 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…