范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

开发必须要懂的协议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

叶倩文60岁已满头白发,但很自然有些明星随着年龄的增长,依然显得很年轻,好像脸上没留下岁月的痕迹,但岁月不饶人,大部分明星也和普通人一样,岁月的痕迹会在脸上显现出来叶倩文也是非常出名的明星,但现在也已经是60来岁处理粽子叶时,不要直接入锅煮,多做一步,粽叶柔韧好包,香味足导语处理粽子叶时,不要直接入锅煮,多做一步,粽叶柔韧好包,香味足距离端午节还有一段时间,但超市里无处不在提醒我们端午节快到了,最显眼的位置有粽子粽子叶糯米等,看着看着就想吃了,我家为陈浩民4次剖腹产,住千万豪宅,隐忍11年的她才是人生赢家陈浩民和蒋丽莎两个人,可谓是娱乐圈中的老夫老妻了,两个人自从结婚以来,短短5年的时间内,孕育了4个孩子。值得一提的是,蒋丽莎的每一胎都是剖腹产,很多宝妈都觉得不可思议。甚至有人将其农田二小时游今天下午头疼得厉害,怎么睡也睡不着,去爬山吧,时间太紧张。想来想去,去附近的农田看看吧。驱车20分钟就到了,拍了几张照片,供大家欣赏。大家知道下面这四张图是什么吗?这是咱们日常吃的越夜越火爆的居酒屋,推杯换盏的背后,暗藏着日本的潜规则文章为唐sir骑马探世界原创,版权归作者所有,欢迎个人分享转载。引言人生最好的旅行,就是你在一个陌生的地方,发现一种久违的感动。旅行让乏味的生活充满意义,让生活多了旅行的心境。作为他是刘邦平天下的第一谋臣,建立汉朝之后,张良却隐居于这里张良被誉为刘邦平天下的第一谋臣,刘邦之所以能平定天下,张良可谓是功不可没。在建立汉朝以后,张良却厌倦了尔虞我诈的生活,选择了归隐山林。感兴趣的朋友,你是否想知道他隐居到哪里了?在建重温95版武则天女演员颜值都是天花板,43岁刘晓庆都美到哭要说到古装剧的颜值巅峰,除了87版的聊斋之外,还有一部作品,也是不得不提。那就是95版的武则天,精致得让人无法触碰。电视剧的主角是武则天,演绎了一代女皇,从一个选秀入宫的少女,成一陈宝国和李雪健到底谁更厉害陈宝国和李雪健都是国家一级演员,都称得上是艺术家,那么两个人谁在业务上更胜一筹呢?年龄不注意的观众可能会有一个误区,那就认为李雪健比陈宝国大很多岁,其实李雪健是1954年出生的,而刘国梁良苦用心曝光!中生代不参赛另有原因,刘诗雯也被委以重任不参赛原因曝光!中生代球员被委以重任,刘国梁真是用心良苦国乒不派中生代球员参赛另有原因!目前在WTT官网公布了6月份几站赛事的参赛名单,而最让人期待的就是克罗地亚这站的比赛,因为在向太透露郭碧婷怀二胎,用好暗指男孩,已为孙子备好大礼娱乐圈竞争激烈,潜规则又多,但是依然有不少人挤破脑袋都想进去,这是为什么?还不都是因为明星太好赚,但凡有点名气的艺人,出场费都不便宜,动辄数百万,片酬几千万。人家演一场戏,分分钟比谷爱凌,神一样的人物谷爱凌,2003年9月3日生于美国,绰号青蛙公主,中国女子自由滑选手。2019年8月16日,获得自由式滑雪坡道跨栏技术公开赛冠军。2021年3月,2枚金牌和1枚铜牌赢得了2021年
祝贺!再夺2金2银2铜国际射击运动联合会官网消息,在埃及开罗当地时间19日进行的射击(步手枪)世锦赛比赛中,中国队收获2金2银2铜。肖嘉芮萱夺得女子25米标准手枪冠军,中国队还包揽青年组男子10米气步枪吴兴涵小金子伤缺陈蒲时灵时不灵!刘彬彬状态平平刘厂长PK韦世豪现在来看,只有主帅郑智亲自登场,或许才能带领球队走出困境。新快报记者高京陈蒲租借至河南嵩山龙门期间,得到河南球迷的认可。在多拉多卡兰加霸占锋线的情况下,陈蒲上赛季为河南队出战24场世界杯哪天开幕?世界杯2022赛程表24VS体育讯北京时间10月20日,世界杯的揭幕战是在当地时间2022年的11月20日19点(北京时间11月21日0时),第二十二届世界杯是由卡塔尔举行的一届世界杯比赛,本届世界杯辽篮1夜3猛料!郭艾伦疑似离队,刘雁宇伤情更新,韩德君上热搜北京时间10月20日,根据郭艾伦个人社交媒体上显示的IP地址来看,他本人似乎已经回到了辽宁,因为IP地址显示的地区正是辽宁。虽然,此消息的真实性没有得到任何部门确定,但结合郭艾伦目跳水世界杯明开幕谁是该赛多金王?全红婵教练排第三10月20日,2022年世界杯跳水赛将在德国柏林鸣枪开战,这项创办于1979年的跳水顶级赛事,40多年来见证了中国跳水运动的辉煌。你知道谁是这项赛事夺金最多的运动员吗?提示一下来自乒乓球冠军赛奥运亚军惨遭淘汰!韩乒一哥指导一姐晋级16强北京时间10月20日,乒乓球WTT冠军赛继续进行,两位华裔名将德国奥运女团亚军韩莹韩国女乒一姐田志希在单打首轮相遇,展开非常精彩的攻削对决,结果双方恶战4局后田志希31胜出,但前三跳水世界杯开赛,中国队赛程出炉,全红婵陈芋汐晚上9点PK跳水世界杯开赛,中国队赛程出炉!全红婵陈芋汐晚上9点PK北京时间10月20日,备受期待的跳水世界杯在柏林正式开赛,中国跳水队将在3天的赛程内不断演绎水花消失术。跳水世界杯每两年举行腐团儿晒出身穿万元香奈儿车库新照!一米3大长腿挡不住,赢麻了接下来又是推荐游戏的时间,最近,王者荣耀推出了妲己时之奇旅皮肤也是收获到许多网友们的喜爱,妲己时之奇旅作为二次元风格的皮肤,也是受到了许多喜欢二次元玩家们的青睐,而网友们也是想到了隔扣国手前锋!阿联不在就化身内线猛兽,山东中锋确实厉害山东队在昨晚继续着CBA新赛季的常规赛征程,对手是广东队。广东队本赛季准备并不充分,全队合练时间不多,表现也比较一般。赛季首战,广东队因故没能赶上,直接被判0比20输给北控男篮,随陶汉林隔扣羞辱,杜锋脸色铁青!球迷他胜任不了国手谁可以?10月19日,广东输给了山东,新赛季前四轮仅1胜3负创造队史最差开局,排在CBA倒数第二位,这是杜锋迎来了执教六年以来的最烂开局,他又是否会成为第一个下课的主教练?主帅杜锋就目前战RedmiK50至尊版对比一加AcePro手机对比K50至尊版对比AceProRedmiK50至尊版更高的分辨率更大的电池容量更快的有线充电更好的前置相机红外遥控更薄及更轻的机身澎湃P1快充芯片高频PWM调光更低的官方售价