OAuth2在项目的应用-扫码登录

news2024/9/25 17:17:08

业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。

参考:https://baike.baidu.com/item/oAuth/7153134?fr=aladdin

Oauth协议:https://tools.ietf.org/html/rfc6749


下面是基于OAuth2协议授权码模式实现,微信扫码认证的流程:

具体流程如下:

1、用户点击微信扫码

用户进入登录页面,点击微信的图标开打微信扫码界面。

现在搞清楚几个概念:

资源:用户信息,在微信中存储。

资源拥有者:用户是用户信息资源的拥有者。

认证服务:微信负责认证当前用户的身份,负责为客户端颁发令牌。

客户端:客户端会携带令牌请求微信获取用户信息,黑马程序员网站即客户端,黑马网站需要在浏览器打开。

2、用户授权网站访问用户信息

询问用户是否授权网站访问自己在微信的用户信息,用户点击“确认登录”表示同意授权,微信认证服务器会颁发一个授权码给网站。

只有资源拥有者同意微信才允许网站访问资源。

3、网站获取到授权码

4、携带授权码请求微信认证服务器申请令牌

此交互过程用户看不到。

5、微信认证服务器向网站响应令牌

此交互过程用户看不到。

6、网站请求微信资源服务器获取资源即用户信息。

网站携带令牌请求访问微信服务器获取用户的基本信息。

7、资源服务器返回受保护资源即用户信息

8、网站接收到用户信息,此时用户在网站登录成功。


OAuth2在项目的应用

本项目是前后端分离架构,前端访问微服务资源也可以基于OAuth2协议进行认证。

要接入微信扫码登录所以本项目要使用OAuth2协议访问微信中的用户信息。

OAuth2的授权模式

OAuth2提供授权码模式、密码模式、简化模式、客户端模式等四种授权模式,前边举的微信扫码登录的例子就是基于授权码模式,这四种模式中授权码模式和密码模式应用较多

OAuth2授权码模式测试

要想测试授权模式首先要配置授权服务器即上图中的认证服务器,需要配置授权服务及令牌策略

说明“:AuthorizationServer用 @EnableAuthorizationServer 注解标识并继承AuthorizationServerConfigurerAdapter来配置OAuth2.0 授权服务器。

@Configuration
 @EnableAuthorizationServer
 public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {

  @Resource(name="authorizationServerTokenServicesCustom")
  private AuthorizationServerTokenServices authorizationServerTokenServices;

 @Autowired
 private AuthenticationManager authenticationManager;

  //客户端详情服务
  @Override
  public void configure(ClientDetailsServiceConfigurer clients)
          throws Exception {
        clients.inMemory()// 使用in-memory存储
                .withClient("XcWebApp")// client_id
                .secret("XcWebApp")//客户端密钥
//                .secret(new BCryptPasswordEncoder().encode("XcWebApp"))//客户端密钥
                .resourceIds("xuecheng-plus")//资源列表
                .authorizedGrantTypes("authorization_code", "password","client_credentials","implicit","refresh_token")// 该client允许的授权类型authorization_code,password,refresh_token,implicit,client_credentials
                .scopes("all")// 允许的授权范围
                .autoApprove(false)//false跳转到授权页面
                //客户端接收授权码的重定向地址
                .redirectUris("http://www.51xuecheng.cn")
   ;
  }


  //令牌端点的访问配置
  @Override
  public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
   endpoints
           .authenticationManager(authenticationManager)//认证管理器
           .tokenServices(authorizationServerTokenServices)//令牌管理服务
           .allowedTokenEndpointRequestMethods(HttpMethod.POST);
  }

  //令牌端点的安全配置
  @Override
  public void configure(AuthorizationServerSecurityConfigurer security){
   security
           .tokenKeyAccess("permitAll()")                    //oauth/token_key是公开
           .checkTokenAccess("permitAll()")                  //oauth/check_token公开
           .allowFormAuthenticationForClients()                //表单认证(申请令牌)
   ;
  }



 }
@Configuration
public class TokenConfig {

    @Autowired
    TokenStore tokenStore;

    @Bean
    public TokenStore tokenStore() {
        //使用内存存储令牌(普通令牌)
        return new InMemoryTokenStore();
    }

    //令牌管理服务
    @Bean(name="authorizationServerTokenServicesCustom")
    public AuthorizationServerTokenServices tokenService() {
        DefaultTokenServices service=new DefaultTokenServices();
        service.setSupportRefreshToken(true);//支持刷新令牌
        service.setTokenStore(tokenStore);//令牌存储策略
        service.setAccessTokenValiditySeconds(7200); // 令牌默认有效期2小时
        service.setRefreshTokenValiditySeconds(259200); // 刷新令牌默认有效期3天
        return service;
    }


}

配置认证管理bean

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

测试。

进入授权页面便可访问资源


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

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

相关文章

2020蓝桥杯真题含2天数(填空题) C语言/C++

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝特别喜欢 2,今年是公元 2020 年,他特别高兴,因为每天日历上都可以看到 2。 如果日历中只显示年月日,请问从公元 …

转录组丨limma差异表达分析,绘制火山图和热图

limma差异表达分析 本篇笔记的内容是在R语言中利用limma包进行差异表达分析,主要针对转录组测序得到的基因表达数据进行下游分析,并将分析结果可视化,绘制火山图和热图 文章目录limma差异表达分析[toc]环境部署与安装输入数据准备差异表达分析…

java JMM 内存屏障

内存屏障的目的 每个CPU都会有自己的缓存(有的甚至L1,L2,L3),缓存的目的就是为了提高性能,避免每次都要向内存取。但是这样的弊端也很明显:不能实时的和内存发生信息交换,分在不同CPU执行的不同线程对同一…

你真的需要文档管理软件吗?

什么是文档管理软件? 文档管理软件 (DMS) 是一种数字解决方案,可帮助组织处理、捕获、存储、管理和跟踪文档。 通过严格管理您的关键业务信息,您可以开发以稳定、可预测、可衡量的方式启动、执行和完成的流程。 如果没有功能齐全的文档管理软…

堆-优先队列priorityqueue原理和应用

java中PriorityQueue优先队列 优先队列 :底层是用数组实现的二叉堆,因为堆通常分为大顶堆或者小顶堆,所以优先队列可以获取每次出来的都是最大或者最小元素(对象可以实现比较器,Java优先级队列默认每次取出来的为最小元…

RocketMQ-NameServer详解

RocketMQ 路由管理 服务注册及服务发现由NameServer提供。 服务发现: 分布式服务 SOA(全称:Service Oriented Architecture 面向服务的架构)构体系中会有服务注册中心,分布式服务 SOA 的注册中心主要提供服务调用的解析…

10套“2023年软考备考资料”送给你

距离软考考试越来越近了,备考的形势越发紧张了。考点那么多,我们需要抓出常考的大部分知识点。 ​为此,为大家整理了《2023年软考免费备考资料》,内含软考各科目不同类型共10套备考资料。 ​ 第1套:早鸟学习计划&am…

华为OD机试题,用 Java 解【密室逃生游戏】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

使用matlab生成符合哈工大学报的图片格式

前言 去年投稿了哈尔滨工业大学学报,因为模板问题没有过于要求投稿的细节,所以出图都是按照自己的风格来的。录用前的最后要求时需要修改图片格式,具体是表示成函数图,并且横纵坐标保持相同的精确位数。我想那么多图片我咋搞呀&a…

Elasticsearch(一)——部署

最近遇到一个需求,需要用到Elasticsearch,于是开始学习Elasticsearch。 我是个学东西先学实操再理论的人。所以开始着手安装Elasticsearch,并进行记录。 目录一、Elasticsearch部署Windows安装1 下载2 解压3 配置文件3.1 jvm.options3.2 elas…

没有公网IP,如何实现内网用友ERP的外网访问 ?

用友是全球领先的企业云服务与软件提供商,在财务、人力、供应链、采购、制造、营销、研发、项目、资产、协同等领域为客户提供数字化、智能化、社会化的企业云服务产品与解决方案。 U8C是用友针对成长型、创新型企业,提供企业级ERP整体解决方案。在系统…

【软件测试】自动化测试的追求,水土不服?看看资深测试咋说的......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 大部分测试初学者入…

mysql存储位置 、数据类型

在线版 mysql0.80 版本 数据库存放位置默认为:C:\ProgramData\MySQL\MySQL Server 8.0 mysql数据类型(来自黑马) 数据类型大小描述备注TINYINT1 byte小整数值SMALLINT2 bytes大整数值MEDIUMINT3 bytes大整数值INT或INTEGER4 bytes大整数值age intBIGINT8 bytes极大整数值F…

MQRabbitMQ

介绍 MQ,中文是消息队列(MessageQueue),字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。 几种常见MQ的对比 RabbitMQActiveMQRocketMQKafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScala&Java…

车载开发知识交流【学习路线】

前言 在2023国内百废待兴;经济复苏的号召一直在响应,这对于压抑了三年的人民来说无疑是福音。这篇我们主要说一下拉动经济的其中大板块——车企;我们知道我们最大的经济除了房地产,第二就是车企。而在造车领域中也不断的加入了许…

CF1692C Where‘s the Bishop? 题解

CF1692C Wheres the Bishop? 题解题目链接字面描述题面翻译题目描述题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示代码实现题目 链接 https://www.luogu.com.cn/problem/CF1692C 字面描述 题面翻译 题目描述 有一个888\times888的棋盘,列编号从…

【Android视频号② 搜索用户】

上一节我们已经拿到了视频号个人主页信息 但是发现传过来的用户名是一个以V2开头的数据 接下来我们就需要根据用户名去获取V2数据 DDMS问题 上一节根据ddms 可以很好的定位到视频号触发点 但是很多人会遇到一个问题就是 Monitor 使用 如果打开报错 需要装Java1.8 版本太高了…

运维排查篇 | Linux 连接跟踪表满了怎么处理

nf_conntrack (在老版本的 Linux 内核中叫 ip_conntrack )是一个内核模块,用于跟踪一个网络连接的状态 一旦内核 netfilter 模块 conntrack 相关参数配置不合理,导致 nf_conntrack table full ,就会出现丢包、连接无法建立的问题 这个问题其…

电子技术——反馈放大器的分析方法总结

电子技术——反馈放大器的分析方法总结 第一种也是最简单的估算方法,直接拿出反馈网络,计算 β\betaβ 则假设在 AβA\betaAβ 无限大的情况下有 Af≃1/βA_f \simeq 1/\betaAf​≃1/β 。开环法。比第一种方法更能精确的估计 AAA 和 β\betaβ 的值。系…

js的异步方法:promise与定时器相遇,碰到的火花

前言: 我们在项目中长使用的异步方法 promise与定时器 在一起后,他们的顺序是什么样呢?这里来说一说。 案例1: console.log(异步打印顺序:);console.log(1);setTimeout(()>{console.log(2);},2000)setTim…