文章目录
- 环境配置
- 创建表
- 遇到的问题
- 提示 Bad client credentials 认证错误
本章代码已提交至Gitee: https://gitee.com/lengcz/distributed-security01.git
环境配置
目前客户端信息和授权码仍然存储在内存中,生产环境中通过会存储在数据库中,下面完善环境的配置:
创建表
(1) 创建表
DROPTABLEIFEXISTS`oauth_client_details`;CREATETABLE`oauth_client_details`(`client_id`varchar(255)NOTNULL,`resource_ids`varchar(255)DEFAULTNULL,`client_secret`varchar(255)DEFAULTNULL,`scope`varchar(255)DEFAULTNULL,`authorized_grant_types`varchar(255)DEFAULTNULL,`web_server_redirect_uri`varchar(255)DEFAULTNULL,`authorities`varchar(255)DEFAULTNULL,`access_token_validity`int(11)DEFAULTNULL,`refresh_token_validity`int(11)DEFAULTNULL,`additional_information`varchar(255)DEFAULTNULL,`create_time`timestampNULLDEFAULTNULLONUPDATECURRENT_TIMESTAMP,`archived`tinyint(4)DEFAULTNULL,`trusted`tinyint(4)DEFAULTNULL,`autoapprove`varchar(255)DEFAULTNULL,PRIMARYKEY(`client_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;-- ------------------------------ Records of oauth_client_details-- ----------------------------INSERTINTO`oauth_client_details`VALUES('c1','res1','$2a$10$iL3DjyR4rTVdYwfp/jDtEurY7cLS7ZVZpShB72L5IFRkR/e9PiiWW','ROLE_ADMIN,ROLE_USER,ROLE_API','authorization_code,password,client_credentials,implicit,refresh_token','https://www.baidu.com/','ROLE_ADMIN,ROLE_USER,ROLE_API','7200','2592000',null,'2026-07-12 00:24:15','0','0','false');DROPTABLEIFEXISTS`oauth_code`;CREATETABLE`oauth_code`(`create_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`code`varchar(255)NOTNULL,`authentication`blobNOTNULL,PRIMARYKEY(`code`))ENGINE=InnoDBDEFAULTCHARSET=utf8;(2)修改UAA的AuthorizationServer,引入passwordEncoder,增加clientDetailsService
@AutowiredprivatePasswordEncoderpasswordEncoder;@BeanpublicClientDetailsServiceclientDetailsService(DataSourcedataSource){ClientDetailsServiceclientDetailsService=newJdbcClientDetailsService(dataSource);//配置数据源((JdbcClientDetailsService)clientDetailsService).setPasswordEncoder(passwordEncoder);//配置密码器returnclientDetailsService;}(3) 使用clientDetailsService
publicvoidconfigure(ClientDetailsServiceConfigurerclients)throwsException{clients.withClientDetails(clientDetailsService);//使用自己的service}(4)原来授权码存储在内存中,现在将授权码存储到数据库中
// @Bean// public AuthorizationCodeServices authorizationCodeServices(){// return new InMemoryAuthorizationCodeServices();//设置授权码模式的使用(授权码存在内存中),// }@BeanpublicAuthorizationCodeServicesauthorizationCodeServices(DataSourcedataSource){returnnewJdbcAuthorizationCodeServices(dataSource);//设置授权码模式的使用(存储到数据库),}(5) 启动UAA ,测试一下。
调用一下/uaa/oauth/token通过密码模式获取令牌
使用/uaa/oauth/check_token 查看令牌,校验令牌合法性。
比较内容是否和数据库一致
授权码测试,打开授权码的连接(注意配置的值需要和数据库中的值保持一致,或者在数据库中存在)
http://localhost:53020/uaa/oauth/authorize?client_id=c1&response_type=code&scope=ROLE_ADMIN&redirect_uri=https://www.baidu.com
打开链接,登录后,提示授权,选择Approve ,并点击按钮。
然后查看oauth_code表,发现这个授权码存在数据库中。
遇到的问题
提示 Bad client credentials 认证错误
请检查 BCrypt格式的密码是否正确
booleaneq=BCrypt.checkpw("明文","密文");//BCrypt比较System.out.println(BCrypt.hashpw("secret",BCrypt.gensalt()));//加密