IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 单点系统---token令牌解析 -> 正文阅读

[网络协议]单点系统---token令牌解析

令牌是由JWT(Json Web Token-是一种json格式)生成。默认生成的是uuid格式的,但是我们要重写这个方法,让它生成的是jwt格式的。并作为响应令牌(Token),从服务端响应到客户端,客户端接收到这个JWT令牌之后,将其保存在客户端(例如localStorage),然后携带令牌访问资源服务器,资源服务器获取并解析令牌的合法性,基于解析结果判定是否允许用户访问资源.

实现一套认证授权系统需要那些对象?

1、系统资源--数据

2、资源拥有者--用户

3、管理资源的服务器

4、对用户进行认证和授权的服务器

5、客户端系统--负载提交用户身份信息的系统

对于一个认证授权系统来讲:

1、提供一个认证的入口---客户端去哪里认证?

2、客户端应携带什么信息去认证?

3、服务端通过谁去对客户端进行认证---一个负责认证的对象?

解答:创建一个认证和授权的配置类去继承AuthorizationServerConfigurerAdapter这个适配器类

然后重写里面的三个方法:

1、提供一个认证入口----客户端在这里认证如图:

下面的三个属性方法,tikenKeyAccess();就是用户登录认证结束后会获取一个令牌。

checkTokenAccess():表示当用户再次访问的时,可以拿着令牌认证,就不用重新登录了。

@Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        //super.configure(security);
        //对外发布认证入口(/oauth/token),认证通过服务端会生成一个令牌
        security.tokenKeyAccess("permitAll()")
                //对外发布检查令牌的入口(/oauth/check_token)
                .checkTokenAccess("permitAll()")
                //允许用户通过表单方式提交认证,完成认证
                .allowFormAuthenticationForClients();
    }

?2、定义客户端应该携带什么信息去认证?

这些标识,密钥都是自己定义的,可以更改。

authorizedGrantTypes("password","refresh_token")--是指定认证类型,可以是密码登录,也可以拿登录成功后获取的令牌,令牌有时间限制,可以设置刷新令牌,刷新后的令牌可以去进行认证

 @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        //super.configure(clients);
        clients.inMemory()
                //客户端标识
                .withClient("gateway-client")
                //客户端密钥(随意)
                .secret(passwordEncoder.encode("123456"))
                //指定认证类型(码密,刷新令牌,三方令牌,...)
                .authorizedGrantTypes("password","refresh_token")
                //作用域(在这里可以理解为只要包含我们规定信息的客户端都可以进行认证)
                .scopes("all");
    }

3、提供一个负责认证授权的对象---完成客户端认证后会颁发令牌,令牌的默认格式是uuid方式,不安全,我们采用jwt格式。

  //提供一个负责认证授权的对象?(完成客户端认证后会颁发令牌,默认令牌格式是uuid方式的)
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        //super.configure(endpoints);
        //设置认证授权对象
        endpoints.authenticationManager(authenticationManager)
                //设置令牌业务对象(此对象提供令牌创建及有效机制设置)
                .tokenServices(tokenService())//不写,默认是uuid
                //设置允许对哪些请求方式进行认证(默认支支持post):可选
                .allowedTokenEndpointRequestMethods(HttpMethod.GET,HttpMethod.POST);
    }

4、生成令牌的方式

 @Bean
    public AuthorizationServerTokenServices tokenService(){
        //1.构建token业务对象
        DefaultTokenServices ts=new DefaultTokenServices();
        //2.设置令牌生成机制(创建令牌的方式,存储用户状态信息的方式)
        ts.setTokenStore(tokenStore);
        //3.设置令牌增强(改变默认令牌创建方式,没有这句话默认是UUID)
        ts.setTokenEnhancer(jwtAccessTokenConverter);
        //4.设置令牌有效时常(可选)
        ts.setAccessTokenValiditySeconds(3600);
        //5.设置刷新令牌以及它的有效时时长(可选)
        ts.setSupportRefreshToken(true);
        ts.setRefreshTokenValiditySeconds(3600*24);
        return ts;
    }

其中tokenStore用来做设置令牌生成机制的对象---创建令牌的方法,存储用户信息的方式。--又因为这个配置别的类也有可能调用,所以单独写了一个token的配置类

@Configuration
public class TokenConfig {//解析登录认证取到的令牌,一致可以访问资源
    //jwt令牌签名key(系统底层对令牌的header,payload部分进行签名时使用的key,
    //这个key一定要保存好,不告知客户端)
    private String signingKey= "auth";//后续还可以将其写到配置中心
    @Bean
    public JwtAccessTokenConverter tokenConverter(){
        JwtAccessTokenConverter tokenConverter=new JwtAccessTokenConverter();
        tokenConverter.setSigningKey(signingKey);//auth为签名key
        return tokenConverter;
    }
    @Bean
    public TokenStore tokenStore(){
        JwtTokenStore tokenStore=new JwtTokenStore(tokenConverter());
        return tokenStore;
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 12:21:50  更:2021-12-05 12:23:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/6 8:06:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码