开发必须要懂的协议oauth
本篇文章让我带你认识一下什么是oauth协议 什么是 oauth协议 ?
百度百科上解释:允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。
简单的来讲就是一个令牌,这个令牌可以有一定的权限,在不知道用户密码的情况下也可以进行部分的功功能操作。用一个例子帮助理解:一个甲方公司,公司里面使用一卡通,这张卡可以门禁,食堂,等等,公司招了外包进来,外包只能开通门禁就行,其他的权限是没有的。这时候公司就不会给一张正式员工的卡,而是外包的卡,正编员工卡就是用户的账号密码,这个外包卡就相当于是一个令牌,并且可能公司会给你的外包卡设置一个有效期,等有效期快到的时候有需要申请延期。这个就相当于是oauth协议模式。用户不会给你用户名和密码,那样相当于放开了所有的权限,而会给你提供一个令牌,在有效期类可以访问特定的功能服务 使用令牌的优点: 令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。 令牌可以被数据所有者撤销,会立即失效。 令牌有权限范围(scope),对于网络服务来说,只读令牌就比读写令牌更安全。密码一般是完整权限 oauth协议有四种模式;
1、授权码模式 2、隐藏式 3、密码式 4、客户端凭证 其中授权码方式是最常用的流程,安全性也最高,今天我们就来着重讲一下授权码模式。 授权码模式: 指的是第三方应用先申请一个授权码,然后再用该码获取令牌,授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。 授权码模式主要分为几个步骤
以甲方公司员工卡系统(SelfResearch.com)和外包公司员工卡系统(outsource.com)为例,下面是授权码模式的流程
请求授权码
首先,甲方公司给外包员工方提供一个授权链接,外包员工点击连接,申请授权码,连接参数如下所示
https://SelfResearch.com/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL&scope=read
response_type参数表示要求返回授权码(code), client_id参数让 甲方 知道是谁在请求, redirect_uri参数是 甲方系统 接受或拒绝请求后的跳转网址, scope参数表示要求的授权范围(这里是只读)。
返回授权码
用户跳转到这个之后,甲方公司会先要求用户登录,然后请求授权,如果同意就跳转到redirect_uri这个参数的地址,并返回授权码
https://SelfResearch.com/callback?code=AUTHORIZATION_CODE
code就是表示授权码
请求令牌
外包员工拿着授权码去请求令牌
https://SelfResearch.com/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL client_id参数和client_secret参数用来让 甲方公司 确认 外包员工 的身份(client_secret参数是保密的,因此只能在后端发请求)。 grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码。 code参数是上一步拿到的授权码。 redirect_uri参数是令牌颁发后的回调网址。
返回令牌 外包员工访问redirect_uri会得到一串json数据: { "access_token": "67c4051b-36c8-11ec-af33-00163e0808bf", "token_type": "bearer", "refresh_token": "71975ccc-36c8-11ec-af33-cfd2826915e5", "expires_in": 3249, "scope": "read" }
access_token就是令牌了,用户需要访问其他接口就需要带上这个token去访问了 refresh_token这个是刷新令牌,如果需要使用新的token,就需要通过这个刷新令牌来获取最新的access_token。 实现 oauth2,可以分为三个步骤认证服务 资源服务 第三方服务
现在第三方用户(test9527)想去访问资源中的部分功能(接口),但是改功能只有User角色才能访问,需要先通过认证服务器获取user的授权码,然后拿着这个code和自己账号信息去获取token,并校验通过之后才能访问到资源服务器,也就是第三方用户通过 test9527 可以访问本来需要user权限才能访问的资源功能(接口)
实现步骤:
创建三个服务oauth-server(认证服务)、resource-server(资源服务)、third-server(第三方服务
maven依赖 org.springframework.security.oauth spring-security-oauth2 2.1.3.RELEASE org.springframework.boot spring-boot-starter-security
oauth-server 服务配置文件 /** * 模拟第三方授权配置 */ @EnableAuthorizationServer @Configuration public class AuthConfig extends AuthorizationServerConfigurerAdapter { @Resource ClientDetailsService clientDetailsService; /** * 资源服务器校验Token */ @Override public void configure(AuthorizationServerSecurityConfigurer security) { security.checkTokenAccess("permitAll()").allowFormAuthenticationForClients(); } /** * 第三方客户端请求配置,和资源服务访问的配置,不设置默认都可以访问,提供默认回调地址 */ @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() //第三方用户 .withClient("test9527") .secret(new BCryptPasswordEncoder().encode("test9527")) .resourceIds("resource") //认证模式 .authorizedGrantTypes("authorization_code","refresh_token") .scopes("all") //回调地址 .redirectUris("http://localhost:8082/notify.html"); } /** * 配置访问端点 */ @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) { endpoints.authorizationCodeServices(authorizationCodeServices()).tokenServices(tokenServices()); } /** * 内存管理 */ @Bean AuthorizationCodeServices authorizationCodeServices() { return new InMemoryAuthorizationCodeServices(); } /** * Token管理规则 */ @Bean AuthorizationServerTokenServices tokenServices() { DefaultTokenServices services = new DefaultTokenServices(); services.setClientDetailsService(clientDetailsService); services.setSupportRefreshToken(true); services.setTokenStore(tokenStore()); services.setAccessTokenValiditySeconds(3600); services.setRefreshTokenValiditySeconds(3600*7); return services; } @Bean TokenStore tokenStore() { return new InMemoryTokenStore(); }
配置spring security /** * 模拟本地用户配置 */ @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * 密码加密方式 */ @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } /** * 内存中虚拟用户和角色 */ @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user") .password(new BCryptPasswordEncoder().encode("123456")) .roles("user"); } /** * 表单登录 */ @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable().formLogin(); } }
resource-server配置 /** * 资源服务管理配置 */ @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { /** * Token令牌校验 */ @Bean RemoteTokenServices tokenServices() { RemoteTokenServices services = new RemoteTokenServices(); services.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token"); services.setClientId("test9527"); services.setClientSecret("test9527"); return services; } /** * 服务资源ID配置 */ @Override public void configure(ResourceServerSecurityConfigurer resources) throws Exception { resources.resourceId("resource").tokenServices(tokenServices()); } /** * 模拟用户权限规则 */ @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() //访问user下的路径需要user角色 .antMatchers("/user/**").hasRole("user") .anyRequest().authenticated(); }
resource下的功能(接口)
第三方服务首先认证,获取授权码code http://localhost:8080/oauth/authorize?client_id=test9527&response_type=code&scope=all&redirect_uri=http://localhost:8082/notify.html
此时会到认证服务器中的user认证
此时需要user用户同意授权,当认证服务中的user用户同意之后,到如下页面,此时看接口可以知道已经拿到code授权码,并跳转到我们需要跳转的地址
redirect_uri=http://localhost:8082/notify.html
拿到授权码之后访问回调地址 http://localhost:8082/notify.html?code=Rs067L 然后通过code,client_id,client_secret 等参数访问获取令牌地址 https://SelfResearch.com/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=SMD5nj&redirect_uri=redirect_uri=http://localhost:8082/notify.html 成功之后会返回token,刷新token,以及token有效时间,如下
拿到token之后,我们再去访问资源服务器,此时就能顺利访问到功能(接口)了
最终效果,最终第三方用户test9527访问当了资源服务器功
至此认证授权完毕,如有错误欢迎指出,共同学习进步
代码地址getee: https://gitee.com/coolhy123/oauth.git
参考: https://segmentfault.com/a/1190000038574022
充电41度,跑351公里,实跑多少?云度新能源1LITE轻享版5门5座大空间SUV,2460mm越级轴距,307L大空间行李箱,满足你的家庭用车需求,品质生活,由此开始!云度新能源1LITE拥有持久续航与极速充电科技
月薪多少能买得起一部iPhone14ProMax?听说iPhone14ProiPhone14ProMax要涨价了?在苹果新机还没有正式发布之前,因为涨价的事儿,网友们算是炸开了锅。由此,也引起了不少人的讨论。有人说,按照自己目前的
正面硬刚英特尔AMD推首款5纳米旗舰CPU本报记者秦枭北京报道AMD在客户(消费市场)的后视镜中,他们再也不会出现在挡风玻璃前了,我们在引领市场。此前,英特尔(Intel)首席执行官基辛格曾暗讽AMD在处理器(CPU)业务
智慧矿山,为矿山安全保驾护航智慧矿山管控平台建设将遵循整体规划分步实施的原则,以物联网互联网大数据云计算人工智能等概念为指导,结合智慧矿山综合自动化技术在线数据检测技术计算机技术3S技术网络技术和采矿专业技术
了不起的婴儿我记不清,因为什么事情让婴儿时期的我一举成名。哦或许是我第一次能独立站立与走稳走好吧。说实话这怎么就能让我一举名呢?还有一次,我偶然跟着电视上说了一句我是主持人郭志坚,可把父母给惊
鸿蒙3全新功能曝光,为华为Mate50专门定制8月30日消息新版本的鸿蒙3将会迎来更新,为华为Mate50推出专属的定制功能。来自数码博主厂长是关同学提供的信息显示,这些定制功能包括小卡片变更形状的能力。根据演示视频,鸿蒙3系
造就如簧巧舌除了吃饭睡觉外,人们干得最多的一件事恐怕就是说话了。和人交谈能够让信息得到沟通,感情得到交流。在某种程度上说话得不得体,常影响一个人在别人心目中的形象,影响他和别人的融洽程度,影响
微淼财商教育秉持教育初心为学员提供更优质的财商教育服务随着社会主义市场经济体制的逐步确立和完善,我国的综合国力得到了很大提高,人民生活水平也不断改善,对投资理财产生了极大的兴趣。然而,由于我国传统观念的影响和过去落后的经济发展水平的制
携程919联合嵊泗推海岛游专场拉动目的地关注度提升近一倍近日,中国旅游研究院发布度假正当时2022中国旅游度假发展报告,报告最新调研显示,国内游客滨海型休闲度假需求占比近三成,仅次于湖泊型休闲度假。而在携程平台上,今年暑期海景房海边民宿
美军为什么炸不断鸭绿江大桥?志愿军是怎么对付美军的空中绞杀的美军为什么炸不断志愿军的鸭绿江大桥?最近这段时间,新闻里挺多炸桥的消息的。在不少简中自媒体的努力宣传之下,桥梁成了前方部队最重要的软肋,似乎后方桥梁一炸,前方部队就得乖乖等死,或者
工业机器人产量如何?工信部去年达36。6万台比2015年增10倍工业和信息化部装备工业一司副司长郭守刚(图片来源工信部)封面新闻记者滕晗9月6日,工业和信息化部装备工业一司副司长郭守刚透露,2021年机器人全行业营业收入超过1300亿元,工业机
灯芯绒西装,真香最能释放魅力的西装之一,就是光泽灯芯绒。光泽灯芯绒坑条细密,光泽内敛,性感华丽不输天鹅绒,所以不用担心会穿出田园牧歌式的效果。绒布自带的粗犷男人味还有留存,日常穿也不会太夸张。男西
头发越黄,上班越狂你永远无法预料,成年人的叛逆会在什么时间到来。隔壁工位的同事昨天早早下班,今天从走进公司大门的那刻开始,就一直挂着神秘的微笑。我整个上午假装无意地瞟了十几眼,才突然从她轻微中透着刻
第九届创新作文大赛高中组特等奖最远的与最近的我发誓有一天我会去找勒内夏尔问他,毒药与解药是否品尝失却的裸,可曾改口如果,遇上小林一茶就问他,爱女是否可知这世界如朝露般短暂可知19世纪的然而我又后悔路途太远成把的光阴,我害怕我
残菊犹香秋天到了尾声,冬天来临,菊花也过了最盛的时节。一茬茬的菊花开过,又纷纷凋残,渐渐稀疏了。想起前些日子观菊,满园姹紫嫣红,争奇斗妍,竟好似犹在眼前,而现在,阳台上那两盆菊花,都耷拉着
人民日报金句英汉互译1。Theroadisatyourfeet,andthelightisahead。道路就在你脚下,光明就在前方人民日报2。Lifeisfair,itisfairtoeveryone
破产重组!币圈惊现雷曼时刻,首席执行官道歉止步于此了见习记者周倬睿币圈雷曼时刻的大剧似乎终于要追完了。11月11日晚间,币圈头部交易所FTX宣布该集团各公司已在美国启动自愿破产保护程序,同时SamBankmanFried辞去首席执行
港澳律师获准内地执业后代理的首宗案件判了近日,港澳律师获准内地执业后代理的首宗案件有了判决结果。11月11日,该案被告的代理律师粤港澳大湾区律师何君尧和内地律师肖硕彬收到了深圳市福田区人民法院送达的民事判决书。这起案件为
为保障冬季用电德国批准核电站继续运转德国目前仍有三座核电站处于运营状态,按计划原定于今年年底下线。受能源短缺的影响,为保障冬季供电,当地时间11日,德国联邦议院通过核能法修正案,允许这三座核电站延长运营至明年四月中旬
人为什么要早起?现在知道还不晚很多时候,我们貌似长大的外表下,掩藏着天真幼稚又脆弱的心灵,有时甚至因为某件微不足道的事情,而失去坚持走下去的勇气,原因就是遇到一些事情扛不住熬不过经不起。英国作家简奥斯汀在理智与
一个知道,一个知足人生有两个大境界,一个知道,一个知足。知道才能清醒地活着,知足才能傻傻的快乐。(摘自老甄絮语)网络图片云衡微语那些浮云,就像过往人生的打酱油一样慢慢地走渐行渐远地过,猛烈不是过错,
又是沧桑一年不知不觉之间已经到了年末岁尾。今宵酒醒何处,杨柳岸,晓风残月。恍惚之间,感觉世间已过百年。回想过去的一年,感觉心间千沟万壑,感慨万千,好像有很多很多的话想说,可是情感的滔滔江水汹涌