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

server/2024/10/18 16:52:37/

文章目录

  • 一,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_tokenHttpResponse 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,保存微博用户信息

@Overridepublic 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_tokenMemberEntity 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.ppmy.cn/server/104410.html

相关文章

小程序-公告滚动

<view class"bg_box icon_nav_box" style"margin-top: -70rpx;position: relative;"><view class"flex flex_y_center"><view class"c_red f32" style"font-style: italic;flex-shrink:0 ;">最新公告<…

google transalte api的使用,V2服务账户方式(google-cloud-java)

Google Cloud Translation API 有几个不同的使用方式&#xff0c;其中之一是使用最新的 Google Cloud Client Library。这些库提供了简化的 API&#xff0c;使得与 Google Cloud 服务的交互变得更加容易。 对于gcp平台的创建方式&#xff0c;我记得得绑定真信用卡了&#xff0c…

Android笔试面试题AI答之Kotlin(17)

文章目录 80. 阐述 inline class内联类的开销&#xff1f;1. 编译时开销2. 运行时开销3. 可维护性和可读性结论 81. Kotlin是如何解决空指针(NPE)问题的 &#xff1f;82. Kotlin中的Compaion Object的作用 &#xff1f;主要用途如何定义注意事项 83. 详细描述 Koltin by lazy工…

《Web项目跨域请求后端Api设置Cookie失败问题?》

问题描述&#xff1a; 在web项目中跨域请求api时&#xff0c;api登录成功后需要向域名中设置cookie实现在两个域名下共享&#xff0c;但是登录接口返回成功&#xff0c;响应头中也有set-cookie&#xff0c;实际却无法设置到cookie中… web项目访问时的域名https://b.com/ api所…

adb 获取手机电池信息与修改恢复

一、获取电池信息 1.1 命令&#xff1a; adb shell dumpsys battery 示例&#xff1a; adb shell dumpsys battery Current Battery Service state:AC powered: falseUSB powered: trueWireless powered: falseMax charging current: 500000status: 2health: 2present: true…

XSS-复现dom破坏案例和靶场

目录 xss注入原理&#xff1a; xss是什么&#xff1f; xss原理&#xff1a; DOM&#xff1a; 闯关&#xff1a; 第一关&#xff1a;Ma Spaghet! 源码&#xff1a; 要求&#xff1a; 分析&#xff1a; 第二关&#xff1a; Jefff 源码&#xff1a; 要求&#xff1a; …

vue3+ts+vant4 列表下拉刷新+分页加载

效果图 主要代码&#xff1a; <van-pull-refreshv-model"refreshing"refresh"handleRefresh"pulling-text"下拉释放刷新"loosing-text"下拉释放刷新"loading-text"加载中"><van-listv-model:loading"loading…

【C++】static

C中的static 说起static&#xff0c;一般想到它的作用是延长变量的生命周期&#xff0c;如果只是这样那么它跟全局变量有什么区别呢&#xff1f; 在C之前&#xff0c;C语言就有static了&#xff0c;C的static作用很简单&#xff0c;就是不让其他文件的访问自己的全局变量。 C中…