谷粒商城实战笔记-220~224-商城业务-微博认证服务-OAuth2.0

news2024/9/23 13:21:31

文章目录

  • 一,220-商城业务-认证服务-OAuth2.0简介
  • 二,221-商城业务-认证服务-微博登录测试
    • 1,创建微博应用
    • 2,应用配置重定向url
    • 3,修改商城登录页面
    • 4,点击微博登录
    • 5,点击授权
  • 三,222-商城业务-认证服务-社交登录回调
    • 6,根据code获取token和用户信息
  • 四,223-商城业务-认证服务-社交登录完成
    • 7,保存微博用户信息
  • 五,224-商城业务-认证服务-社交登录测试成功

一,220-商城业务-认证服务-OAuth2.0简介

OAuth 2.0 是一个授权框架,它允许第三方应用以受控的方式访问用户的数据,比如商城访问用户的微信数据,商城是第三方应用。

以下是一个 OAuth 2.0 授权流程的例子(微信用户授权商城访问用户数据):

  • 1,用户在商城应用上尝试访问自己的微信数据,点击微信按钮,跳转到微信授权界面,用户输入用户名密码并确认授权;
  • 2,微信服务接收到授权请求后,验证用户名密码,确认用户信息准确无误,重定向到商城应用,并附带一个微信授权码;
  • 3,商城携带授权码向微信服务器申请令牌;
  • 4, 授权服务器验证授权码的有效性,如果通过验证,则返回一个访问令牌和一个刷新令牌。
  • 5,第三方应用使用访问令牌去访问用户的资源服务器上的数据。
  • 6,资源服务器验证访问令牌的有效性,如果通过验证,则返回用户的数据。

需要注意的是,OAuth 2.0 不是一种认证协议,而是一种授权框架。OAuth 2.0 主要用于授权第三方应用访问用户的数据,而不是用来进行身份验证。

二,221-商城业务-认证服务-微博登录测试

1,创建微博应用

课程使用微博做认证,首先需要在微博创建一个应用,获取AppKey/AppSecret等验证信息。

如下,我们创建一个叫做gulimall_lcy的微博应用,这个应用名称无关紧要,不重复即可。

在这里插入图片描述
创建成功后,在我的应用中可以看到授权信息。

在这里插入图片描述

2,应用配置重定向url

当用户输入登录信息,微博验证通过后,还需要回到商城,但是微博并不知道商城地址,所以需要配置回调地址。
在这里插入图片描述

3,修改商城登录页面

指定微博应用url,用户点击微博图像后,就会携带微博应用id到微博登录授权界面,所以需要在登录界面配置App Key。

如下图,修改两点:

  • ① client_id就是微博应用的App Key
  • ② redirect_url就是上一步配置回调地址,一定要和微博配置一直,否则无法访问微博登录授权界面
    在这里插入图片描述

4,点击微博登录

点击左下角的微博图片按钮。
在这里插入图片描述
进入微博认证界面。

在这里插入图片描述

认证通过后,进入授权界面。
在这里插入图片描述

5,点击授权

点击授权后,微博告诉浏览器重定向到配置的URL,并在URL后附带一个Code。

在这里插入图片描述

三,222-商城业务-认证服务-社交登录回调

6,根据code获取token和用户信息

上一节第五步后,回调的商城网页会得到一个code。我们要编写一个接口处理根据这个code去微博后台获取token。

 @GetMapping(value = "/oauth2.0/weibo/success")
    public String weibo(@RequestParam("code") String code, HttpSession session) throws Exception {

        Map<String, String> map = new HashMap<>();
        map.put("client_id","2075774");
        map.put("client_secret","40af05ba6a6e9cd3bf799fd");
        map.put("grant_type","authorization_code");
        map.put("redirect_uri","http://auth.gulimall.com/oauth2.0/weibo/success");
        map.put("code",code);

        //1、根据用户授权返回的code换取access_token
        HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "post", new HashMap<>(), map, new HashMap<>());

        //2、处理
        if (response.getStatusLine().getStatusCode() == 200) {
            //获取到了access_token,转为通用社交登录对象
            String json = EntityUtils.toString(response.getEntity());
            //String json = JSON.toJSONString(response.getEntity());
            SocialUser socialUser = JSON.parseObject(json, SocialUser.class);

            //知道了哪个社交用户
            //1)、当前用户如果是第一次进网站,自动注册进来(为当前社交用户生成一个会员信息,以后这个社交账号就对应指定的会员)
            //登录或者注册这个社交用户
            System.out.println(socialUser.getAccess_token());
            //调用远程服务
            R oauthLogin = memberFeignService.oauthLogin(socialUser);
            if (oauthLogin.getCode() == 0) {
                MemberResponseVo data = oauthLogin.getData("data", new TypeReference<MemberResponseVo>() {});
                log.info("登录成功:用户信息:{}",data.toString());

                //1、第一次使用session,命令浏览器保存卡号,JSESSIONID这个cookie
                //以后浏览器访问哪个网站就会带上这个网站的cookie
                //TODO 1、默认发的令牌。当前域(解决子域session共享问题)
                //TODO 2、使用JSON的序列化方式来序列化对象到Redis中
                session.setAttribute(LOGIN_USER,data);
                
                //2、登录成功跳回首页
                return "redirect:http://gulimall.com";
            } else {
                return "redirect:http://auth.gulimall.com/login.html";
            }

        } else {
            return "redirect:http://auth.gulimall.com/login.html";
        }

    }

这段Java代码是一个Spring MVC控制器方法,用于处理微博OAuth 2.0授权流程中的成功回调。下面是对这段代码核心功能的解释:

  1. 处理微博授权回调:

    • 这个方法通过@GetMapping注解指定了一个HTTP GET请求处理路径/oauth2.0/weibo/success。当用户在微博完成授权后,微博会重定向用户到这个路径,并携带code参数。
  2. 获取Access Token:

    • 通过POST请求向微博服务器发送code和其他必要的认证信息(如client_id, client_secret, grant_type, 和redirect_uri),来交换用户的Access Token。
  3. 重定向:

  • 如果获取token成功,微博服务会将用户信息返回给商城服务,商城后台调用会员服务保存会员信息,之后将用户重定向回商城主页 (http://gulimall.com)。
  • 如果登录失败或出现问题,将用户重定向回登录页面 (http://auth.gulimall.com/login.html)。

总结来说,这段代码的主要目的是:

  • 接收来自微博的授权回调,获取Access Token。
  • 使用Access Token进行用户登录或注册,并将登录状态保存在会话中。
  • 根据登录结果重定向用户到相应的页面。

四,223-商城业务-认证服务-社交登录完成

这一节的主要内容是处理获取token成功后,需要把接口返回的用户信息保存到会员服务中。

7,保存微博用户信息

@Override
    public MemberEntity login(SocialUser socialUser) throws Exception {

        //具有登录和注册逻辑
        String uid = socialUser.getUid();

        //1、判断当前社交用户是否已经登录过系统
        MemberEntity memberEntity = this.baseMapper.selectOne(new QueryWrapper<MemberEntity>().eq("social_uid", uid));

        if (memberEntity != null) {
            //这个用户已经注册过
            //更新用户的访问令牌的时间和access_token
            MemberEntity update = new MemberEntity();
            update.setId(memberEntity.getId());
            update.setAccessToken(socialUser.getAccess_token());
            update.setExpiresIn(socialUser.getExpires_in()+"");
            this.baseMapper.updateById(update);

            memberEntity.setAccessToken(socialUser.getAccess_token());
            memberEntity.setExpiresIn(socialUser.getExpires_in()+"");
            return memberEntity;
        } else {
            //2、没有查到当前社交用户对应的记录我们就需要注册一个
            MemberEntity register = new MemberEntity();
            //3、查询当前社交用户的社交账号信息(昵称、性别等)
            Map<String,String> query = new HashMap<>();
            query.put("access_token",socialUser.getAccess_token());
            query.put("uid",socialUser.getUid());
            HttpResponse response = HttpUtils.doGet("https://api.weibo.com", "/2/users/show.json", "get", new HashMap<String, String>(), query);

            if (response.getStatusLine().getStatusCode() == 200) {
                //查询成功
                String json = EntityUtils.toString(response.getEntity());
                JSONObject jsonObject = JSON.parseObject(json);
                String name = jsonObject.getString("name");
                String gender = jsonObject.getString("gender");
                String profileImageUrl = jsonObject.getString("profile_image_url");

                register.setNickname(name);
                register.setGender("m".equals(gender)?1:0);
                register.setHeader(profileImageUrl);
                register.setCreateTime(new Date());
                register.setSocialUid(socialUser.getUid());
                register.setAccessToken(socialUser.getAccess_token());
                register.setExpiresIn(socialUser.getExpires_in()+"");

                //把用户信息插入到数据库中
                this.baseMapper.insert(register);

            }
            return register;
        }

    }

  1. 接收SocialUser对象:

    • 方法接收一个SocialUser对象作为参数,该对象包含了用户从社交平台(本例中为微博)获得的信息,包括用户ID (uid)、访问令牌 (access_token) 和有效期限 (expires_in)。
  2. 检查用户是否已存在:

    • 首先检查数据库中是否存在与当前社交用户ID (uid) 相匹配的记录。如果存在,则表明该用户之前已经登录过系统。
  3. 已注册用户:

    • 如果用户已注册,更新用户的访问令牌 (access_token) 和有效期限 (expires_in)。
    • 更新数据库中的用户信息。
    • 返回已更新的用户信息。
  4. 新用户注册:

    • 如果用户未注册,从微博API获取用户的详细信息,如昵称、性别和头像URL。
    • 创建一个新的MemberEntity对象,并填充从微博获取的用户信息。
    • 将新的用户信息保存到数据库。
    • 返回新注册的用户信息。
  5. 返回用户实体:

    • 不论是已存在的用户还是新注册的用户,最终都会返回一个包含用户信息的MemberEntity对象。

五,224-商城业务-认证服务-社交登录测试成功

总结一下整个微博认证的流程。

  • ① 在登录界面选择用微博认证登录
  • ② 跳转到微博用户认证界面,需要用微博的账号登录
  • ③ 跳转到微博的授权界面,点击授权按钮,生成一个code
  • ④ 授权成功后,重定向到配置的回调地址,调用商城服务的一个后台接口,携带上一步微博生成的code
  • ⑤ 商城服务根据上一步携带的code参数,调用微博服务提供的接口获取token。
  • ⑥ 微博服务根据code验证通过后,生成token,将其与部分用户信息一并返回。
  • ⑦ 商城服务接收到微博服务返回的token和用户信息,将用户信息包括token保存在会员服务中。
  • ⑧ 商城服务重定向到商城首页,整个微博登录完成。

微博登录的前提是:

  • 有微博账号,注册为微博开发者,创建一个微博应用,生成App Key和App Secret。
  • 微博应用后台登记请求转发地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[译]开发者与熵的博弈

原文&#xff1a;https://itnext.io/entropy-in-software-development-77ed9110ef28 翻译&#xff1a;我的文章翻译智能体 文章润色智能体 文章转脑图智能体 人工校对 文章脉络&#xff1a; 文章概括&#xff1a; 文章通过热力学的视角&#xff0c;深入探讨了软件开发中的复…

GitHub的未来:在微软领导下保持独立与AI发展的平衡

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

企业高性能web服务器----nginx详细知识点+实验

知识点 一、Web 服务介绍 Apache Nginx 1、Apache 经典的 Web 服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X 其可以通过编译安装实现特定的功能 2、Apache的三种模型 Apache prefork 模型 预…

4000元亮度最高的投影仪:当贝X5S 3300CVIA流明超高亮度白天也清晰

你购买投影仪的时候一般预算多少&#xff1f;目前市面上的投影仪价位有几百也有上万&#xff0c;品牌和类型都比较多&#xff0c;买投影前比较关注哪些投影仪参数&#xff1f;最近有朋友向我咨询购买投影仪的事项&#xff0c;预算在4000左右&#xff0c;问问4000元哪款投影仪哪…

Ollama Desktop

一、简介 Ollama Desktop是基于Ollama引擎的一个桌面应用解决方案&#xff0c;用于在macOS、Windows和Linux操作系统上运行和管理Ollama模型的GUI工具。 Ollama Desktop提供了丰富的功能&#xff0c;包括但不限于&#xff1a; 可视化的管理界面&#xff1a;用户可以通过图形…

推荐3款免费强大OCR神器,工作必备,总有一款适合你,必须收藏

ShareX ShareX是一款功能强大且免费的开源屏幕捕捉和录屏工具&#xff0c;主要用于Windows操作系统。它不仅可以捕捉任何屏幕区域&#xff0c;还可以录制视频、拍摄屏幕截图&#xff0c;并将其上传到各种在线平台。ShareX的功能非常全面&#xff0c;包括截图、录屏、加水印、裁…

低代码平台:效率与创新的双重引擎

低代码开发在软件开发领域是一种越来越流行的趋势&#xff0c;这是有充分理由的。低代码使专业开发人员和非开发人员能够构建更易于集成、修改和升级的复杂企业解决方案&#xff0c;使企业能够快速轻松地创建软件应用程序无需丰富的编码经验。低代码平台彻底改变了软件开发方式…

LLM应用实战: 产业治理多标签分类

1. 背景 许久未见&#xff0c;甚是想念~ 近期本qiang~换了工作&#xff0c;处于新业务适应期&#xff0c;因此文章有一段时间未更新&#xff0c;理解万岁&#xff01; 现在正在着手的工作是产业治理方面&#xff0c;主要负责其中一个功能模块&#xff0c;即按照产业治理标准体…

巡检机器人有哪些功能和应用场景

随着科技的飞速发展&#xff0c;巡检机器人作为智能化、自动化的重要代表&#xff0c;已经在多个领域展现出其独特的优势。从工业生产到特殊环境监测&#xff0c;巡检机器人以其高效、准确和安全的特性&#xff0c;逐渐取代了传统的人工巡检方式&#xff0c;极大地提升了巡检效…

spring boot(学习笔记第十八课)

spring boot(学习笔记第十八课) Spring boot的定时任务和Quartz 学习内容&#xff1a; Spring boot的定时任务Spring boot的Quartz 1. Spring boot的定时任务 定义定时任务 加入必要的依赖 <dependency><groupId>org.springframework.boot</groupId&g…

STM32 —— TIM(基本定时器)详解_stm32的tim

STM32 —— TIM&#xff08;基本定时器&#xff09;详解_stm32的tim 一、定时器简介 STM32F1 系列中&#xff0c;除了互联型的产品&#xff0c;共有 8 个定时器&#xff0c;分为基本定时器&#xff0c;通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向…

ID3算法详解:构建决策树的利器

目录 引言 ID3算法概述 算法基础 信息熵 ​编辑 信息增益 ID3算法步骤 决策树 概念: 核心&#xff1a; 节点 1. 根节点 2. 非叶子节点 3. 叶子节点 引言 在机器学习领域&#xff0c;决策树是一种非常流行的分类和回归方法。其中&#xff0c;ID3算法作为决策树算法…

干货分享 | TSMaster—RP1210模块使用指南

RP1210是由技术和维护委员会&#xff08;TMC&#xff09;编写的一种建议性实践。RP1210用于对重型车辆射频相关的&#xff08;主要针对&#xff09;电子控制单元&#xff08;ECU&#xff09;进行二次编程和分析。本文主要针对TSMaster—RP1210模块的操作进行详细介绍。 本文关…

【CANoe使用大全】——在线回放数据

&#x1f64b;‍♂️【CANoe使用大全】系列&#x1f481;‍♂️点击跳转 文章目录 1.概述2.创建回灌节点3.加载回灌数据 1.概述 在外面测试过程中经常会遇到一些故障场景&#xff0c;需要采集这些时刻的故障场景log&#xff0c; 回灌到程序中复现问题。 下面主要介绍数据的在…

【电子通识】IPC-A-610标准对产品的四种验收条件都是什么意思?

IPC-A-610标准对每个级别产品均给出四种验收条件&#xff1a;目标、可接受、缺陷或制程警示条件。 目标条件 是指近乎完美/首选的情形&#xff0c;然而这是一种理想而非总能达到的情形&#xff0c;且对于保证组件在使用环境下的可靠性并非必要的情形。 比如4.3.2节中连接器插针…

R8;RRRRRRRR;穿膜肽R8;八聚精氨酸;148796-86-5

【穿膜肽R8简介】 穿膜肽R8&#xff0c;也称为八聚精氨酸&#xff08;Octa-arginine&#xff09;&#xff0c;是一种由八个精氨酸残基组成的细胞穿透肽&#xff08;CPP&#xff09;。R8具有正电荷丰富的侧链&#xff0c;能够有效地与细胞膜上的负电荷相互作用&#xff0c;从而促…

优化电商客服满意度与复盘管理:AI质检技术的深度应用与策略

Hi~这里是ProXiao 文章参考&#xff1a;晓观点 《如何利用AI质检提升电商客服满意度&#xff0c;优化分析复盘管理环节&#xff1f;》 在当前电子商务迅猛发展的背景下&#xff0c;客户服务质量作为衡量店铺综合竞争力的重要指标之一&#xff0c;其优劣直接关联到服务类数据评分…

Docker图形化管理工具DockerUI

1、DockerUI 轻量级图形页面管理之DockerUI 2、查看dockerui镜像 [rootlocalhost ~]# docker search dockerui 3、下载dockerui镜像 [rootlocalhost ~]# docker pull abh1nav/dockerui #选择喜欢的dockerui风格镜像下载 4、启动dockerui容器 [rootlocalhost ~]# docker r…

Python经典书籍有哪些?来看看你看过哪几本

Python 基础 1.《Python编程&#xff1a;从入门到实践&#xff08;第2版&#xff09;》 本书是针对所有层次Python读者而作的Python入门书&#xff0c;让你可以快速学会Python编程&#xff0c;通过这本书&#xff0c;你将会学到各种Python库和工具(NumPy&#xff0c;Pygal等)…

C/C++控制台贪吃蛇游戏的实现

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 一、…