spring security oauth2 改进 使用JWT认证
接着上一篇spring security oauth2 入门,之后网上查阅了一些资料,准备对oauth2修改使用jwt的模式认证,使用jwt有两种认证方式1,对称加密方式。2,非对称加密方式,本文将逐一介绍
1,对称加密方式,此种方式很简单,因为配置资源服务器和认证服务器在同一个应用中,所以只要在认证服务器配置中稍作修改即可
认证服务器加此配置
//jwt转换器
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
//加密秘钥
converter.setSigningKey("123");
return converter;
}
同时配置在认证服务器配置中配置token端点
@Override
//配置授权以及令牌的访问端点和令牌服务
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
//数据库存储
endpoints.tokenStore(tokenStore())
//token转换,使用jwt 加上此配置即可
.accessTokenConverter(accessTokenConverter())
.authenticationManager(authenticationManager)
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.GET);
}
运行测试 成功
2,非对称加密方式
首先创建证书库,一个.jks文件用来认证用的,,在jks文件中可以提取公钥和私钥,此文件可以用jdk来生成
进入到jdk的bin目录,打开命令提示窗
输入以下命令
Keytool -genkeypair -alias ims.abc.com -keyalg RSA -keysize 2048 -keypass mypassword -sigalg SHA256withRSA -dname "CN=ims.abc.com,OU=SUIBIAN,O=SUIBIAN,L=beijing,C=CN" -validity 5475 -keystore C:\Users\zongw\ims.abc.com_keystore.jks -storetype JKS -storepass mypassword
alias 别名 可以随便取,之后要用到
keyalg证书类型
keysize密钥长度
keypass私钥密码
sigalg签名算法
dname证书域名 CN属性比较重要,如何申请证书的话必须是域名,此处自定义,其他属性可随意填写
validity证书有效天
keystore JKS 文件
storetype 证书库类型
storepass 证书库密码
执行以上命令会在文件夹中生成jks文件
接下来,需要根据jks文件,获取到公钥信息,继续输入命令
keytool -list -rfc -keystore C:\Users\zongw\ims.abc.com_keystore.jks -storepass mypassword
红框中所示就是公钥信息,复制保存。接下来把生产好的文件放入到项目的resources中
public.txt是获取的公钥信息
接下来修改项目中的代码
注释掉对称加密的代码,加上非对称加密代码
//jwt 非对称加密
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
//私钥,jks文件路径,以及申请时的密码
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("ims.abc.com_keystore.jks"), "mypassword".toCharArray());
//此处传入的是创建jks文件时的别名-alias ims.abc.com
converter.setKeyPair(keyStoreKeyFactory.getKeyPair("ims.abc.com"));
//公钥(读取public.txt的公钥信息)
Resource resource = new ClassPathResource("public.txt");
String publicKey = null;
try {
publicKey = inputStream2String(resource.getInputStream());
} catch (final IOException e) {
throw new RuntimeException(e);
}
converter.setVerifierKey(publicKey);
return converter;
}
String inputStream2String(InputStream is) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(is));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
return buffer.toString();
}
其他地方不需要动,启动项目,用postman访问
得到token,并存储到数据库
浏览器访问
访问成功
至此jwt加密介绍完毕,因为此文是按照第一篇文章的续写,有不懂的小伙伴,可先看第一篇文章。
多介绍一条命令,此命令跟此文无关
keytool -certreq -keyalg RSA -alias ims.abc.com -keystore C:\Users\zongw\ims.abc.com_keystore.jks -storetype JKS -storepass mypassword -file C:\Users\zongw\ims.abc.com_certreq.csr
此命令是根据jks文件生产csr文件(也就是证书请求),可以用此文件来申请证书!
----------------------------------------------------------------
修改一下配置文件,可以使用https访问
key-store : classpath:ims.abc.com_keystore.jks key-store-password : mypassword keyStoreType : JKS keyAlias : ims.abc.com
使用https访问
使用fildder抓取一下请求