org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-oauth2
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.0.RELEASE
security.oauth2
client
0.0.1-SNAPSHOT
client
OAuth2的客户端
1.8
Hoxton.SR4
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-oauth2
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
server.port=8090
因为我在OAuth2认证服务器上写的回调地址的端口是8090,所以此处设置成8090端口
security.oauth2.sso.login-path=/callback
因为我在OAuth2认证服务器上写的回调地址是callback,所以此处设置成callback,必须和认证服务器上设置的回调地址一致,否则会报错
#客户端id security.oauth2.client.client-id=client #客户端secret security.oauth2.client.client-secret=secret
#获取授权码的地址 security.oauth2.client.user-authorization-uri=http://localhost:8080/oauth/authorize
security.oauth2.client.access-token-uri=http://localhost:8080/oauth/token
security.oauth2.resource.token-info-uri=http://localhost:8080/oauth/check_token
server.servlet.session.cookie.name=OAuth-Client
原因:如果同一台服务器(或电脑)上,同时部署了多个Spring Boot项目(假设A、B项目),但是项目之间没有任何关系,相互独立。然后在同一个浏览器上,同时请求A、B项目上的服务,在A项目进行定时认证session时,前端在发起Request请求时常将B的sessionId 当做A的sessionId上传给A,而导致A项目验证session时失败。
出现这种情况的原因是:A、B项目存储SessionId 的cookie name 相同,浏览器傻傻分不清JSESSIONID到底是A还是B的,所以就拿错了。
解决办法:在A项目的application.properties 中设置session的cookie名称,与B项目的session的cookie名称不相同即可。
8、完整的application.properties配置
server.port=8090
spring.application.name=sso-client
#登陆路径
#security.oauth2.sso.login-path=/login
security.oauth2.sso.login-path=/callback
#客户端id
security.oauth2.client.client-id=client
#客户端secret
security.oauth2.client.client-secret=secret
#获取授权码的地址
security.oauth2.client.user-authorization-uri=http://localhost:8080/oauth/authorize
#获取token的地址
security.oauth2.client.access-token-uri=http://localhost:8080/oauth/token
#校验token的地址
security.oauth2.resource.token-info-uri=http://localhost:8080/oauth/check_token
#禁止同名的sessionId,是个坑,不加会报错
server.servlet.session.cookie.name=OAuth-Client
spring.thymeleaf.prefix = classpath:/templates/
#spring.thymeleaf.suffix = .html
spring.thymeleaf.encoding = UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.cache = false
加入注解:@EnableOAuth2Sso
package security.oauth2.client.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ClientController {
@GetMapping("/callback")
public String callback(){
return "SSO Client callback!";
}
@GetMapping("/oauth-client")
public String oauthClient(){
return "This is SSO Client!";
}
}
1、在浏览器中输入:localhost:8090/oauth-client后,跳转到了认证服务器的登录界面,同时Set-Cookie设置的cookie名称也从JSESSIONID变为了OAuth-Client。
2、输入用户名密码后,进入是否同意授权的界面
3、选择同意授权后,跳回原来浏览器请求的客户端的地址,同时在服务器给出的回调地址中可以查看到认证服务器返回的授权码code