实现的工具 Oauth2
基于前后端的令牌的实现
eg:小区让快递员进入小区的方法
1.远程开门 2.告诉密码 3.使用令牌
生活中的Oauth2的运用
eg:京东使用qq wx 的扫码授权登录
callback?code码可以换一次只能换一次令牌,这样解决了授权的问题,jd可以获得qq的用户数据
Oauth1不安全
Oauth2角色
Resource Owner 资源持有者是用户 “我” 我来授权认证
Client 京东
授权码模式:最严谨最安全,一个码只能换一次令牌,拿着码也无用了,京东拿到码去换令牌,浏览器看不到码
简化模式:直接申请令牌 直接返回令牌(token),没有吧令牌存到服务器,不安全,浏览器的能看到,原因是静态的页面可能没有服务器保存
密码模式:客户端和服务器高度信任,一个公司,甚至一个项目,T31这种前后端高度的信任,可以用密码
客户端模式:都是自己的报名字直接要
前后端是跨域的,前端访问后端,就要拿到用户名和密码,
淘宝使用的 jwt
授权码拿令牌,根据令牌访问不同的服务
前后端分离,分体项目自然是跨域的,后段的微服务没有跨域但是也有可能需要令牌携带权限
跨域:域名 端口 协议
移动端没有cookie
token大于session
资源服务器拿到浏览器传来的令牌,要和授权服务器颁发的令牌做比较
要使用Oauth进行权限认证,需要配合Security放行相关资源
@Configuration
@EnableWebSecurity
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
//数据库
protected void configure(AuthenticationManagerBuilder auth) throws Exception { //auth.inMemoryAuthentication()
auth.inMemoryAuthentication()
.withUser("lxs")
.password("{noop}123") //使用springsecurity5,需要加上{noop}指定使用NoOpPasswordEncoder给DelegatingPasswordEncoder去校验密码
.roles("admin");
}
@Override
public void configure(WebSecurity web) throws Exception {
//放行静态资源
//解决静态资源被拦截的问题
// web.ignoring().antMatchers("/asserts/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//默认放行的地址,由这些节点发起认证
http
.formLogin().permitAll()
.and().logout().logoutUrl("/logout").logoutSuccessUrl("/")
.and().authorizeRequests().antMatchers("/oauth/**", "/login/**", "/logout/**", "/api/**").permitAll()
.anyRequest().authenticated()
// 关闭跨域保护;
.and().csrf().disable();
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
Oauth2配置继承ResourceServerConfigurerAdapter
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//没有令牌都不能访问
http.authorizeRequests().antMatchers("/**").authenticated();
// 禁用CSRF
http.csrf().disable();
}
}
得到了code 现在需要的是拿码换令牌 是post请求
“1799” 是过了1s 加上正好 30分钟
重新申请 已经失效了码
目前通过地址栏传令牌是不安全的,还可以通过bearer传令牌
简化了授权模式 直接访问就返回了令牌和code
此时关闭服务器 就失效了
没有浏览器了 直接发送密码
浏览器不能访问