jobmission / oauth2-server

spring boot (springboot 3+) oauth2 server sso 单点登录 认证中心 JWT,独立部署,用户管理 客户端管理
MIT License
488 stars 222 forks source link

请问下 如果我想在server端做前后端分离应该怎么做 #9

Closed 465109835 closed 5 years ago

465109835 commented 5 years ago

现在我试着在singIn方法的时候直接response.sendRedirect()到前端页面 . 现在出的问题是在客户端AuthorizationCodeAccessTokenProvider类getParametersForTokenRequest方法处 拿preservedState的时候永远是空值 所以一直报Possible CSRF detected - state parameter was required but no state could be found

465109835 commented 5 years ago

客户端 我使用了spring-security-oauth2-autoconfigure 2.0.5.RELEASE版本

465109835 commented 5 years ago

本地起服务我使用了你再之前问题中提供的nginx配置

jobmission commented 5 years ago

Oauth2 Resource Server就是用来前后端分离的。 参照 oauth2-server/src/main/java/com/revengemission/sso/oauth2/server/controller/ProfileController.java ,正常写controller;然后在 oauth2-server/src/main/java/com/revengemission/sso/oauth2/server/config/ResourceServerConfiguration.java 类中配置权限拦截和允许跨域

jobmission commented 5 years ago

资源端可以参照jobmission/oauth2-resource例子,和oauth2-server分离

465109835 commented 5 years ago

但是 现在访问保护的客户端资源 ,客户端重定向到授权服务器,服务器如何跳转到 前后端分离的登录页面呢. 不知道有没有描述清楚. 非常感谢你这么快回复了我.

jobmission commented 5 years ago

参照bREADME.md里边写的,不跳转模式,grant_type=password; Post /oauth/token?client_id=SampleClientId&client_secret=tgb.258&grant_type=password&scope=user_info&username=zhangsan&password=tgb.258

具体参数修改一下就可以

465109835 commented 5 years ago

password模式 客户端配置我修改 spring.security.oauth2.client.registration.sso-login.authorization-grant-type=password 后报了一个异常 Factory method 'clientRegistrationRepository' threw exception; nested exception is java.lang.IllegalArgumentException: authorizationGrantType must be authorization_code 我需要用什么方式 配置客户端使用password 方式 调用授权服务器

465109835 commented 5 years ago

image 里面好像没有提供password模式 不知道需要怎样配置

465109835 commented 5 years ago

是否是我理解错误 password模式是不是需要客户端提供登录界面. 而不会统一到中心的登录界面去登录

jobmission commented 5 years ago

密码模式:登录界面由客户端提供,调用授权中心接口,返回token,你可以先用postman等REST工具调试一下接口是否正确返回token;

jobmission commented 5 years ago

grant-type的不同场景,你可能还没有理解,你看一下相关文章

465109835 commented 5 years ago

谢谢
image 密码模式直接掉接口是ok的 . 我确实没有太理解grant-type. 业务上需要在中心做单点登录.所以应该不能使用密码模式了

465109835 commented 5 years ago

这样是否意味着 授权服务器的登录界面不能使用前后台分离的形式了.

jobmission commented 5 years ago

你可以用密码模式登录成功后,自己在前台跳转; 或者用标准的Oauth2 网页授权模式,成功后自动返回之前的页面,现在是支持的

465109835 commented 5 years ago

之前是试着用授权码模式 , 但是在前后端分离情况下客户端接受到认证服务器的带code的回调后 ,在去请求access_token前会报Possible CSRF detected - state parameter was required but no state could be found 这个异常.不知道是怎样引起的

jobmission commented 5 years ago

目测你的项目不是完全的前后端分离; 前后端分离至少三个模块:A授权中心,B资源(web service接口),C前端页面或者APP; 前端页面js获取token(password模式)---->>>前端页面调用web api(携带token)------>>>资源服务器调用验证token; 所以前端页面获取token后,js跳转就可以(目标页面可能在浏览器端的存储里边)

465109835 commented 5 years ago

确实 我忘记了其他前后端分离的项目都会有自己的登录页面 可以直接使用密码模式. 但是还是会有之前遗留下来没有前后端分离的项目. 对于这些项目 中心需要提供登录页面.这时做法是用授权码模式 还是密码模式呢

jobmission commented 5 years ago

个人想法, 遗留项目用密码模式简单一点吧,登录和验证权限的地方改改就可以了; 授权码模式估计改的东西多,但是效果应该更好;

465109835 commented 5 years ago

非常非常感谢.....

465109835 commented 5 years ago

还有个问题 我刚测试使用password获得的accecc_token访问资源服务器的时候是可以的. 那是不是说单点登录 所有客户端都必须也是资源端

465109835 commented 5 years ago

密码模式 : 需要单点登录的服务就都变成了资源服务器. 然后前端需要负责刷新access_token 是这个意思是吗 . 如果这样 处理起来也不是太方便

465109835 commented 5 years ago

所以 貌似只有使用授权码模式.. 后台可以自动刷新token

jobmission commented 5 years ago

客户端和资源端是不一样的,客户端是调用端如app、pc,资源端是提供服务器的如接口, password模式需要前端来定时刷新token,或者token过期后用refresh_token刷新token,因为refresh_token和token过期时间不一样; 授权码模式可以在后端用框架代码帮着刷新token,但就不是前后端分离了

465109835 commented 5 years ago

谢谢 明白了 , 也就是说 后台提供服务的应用都是资源服务器. 前台管理accessToken, 但是这里前端在多应用之间共享acess_token有困难吧 .

465109835 commented 5 years ago

这里解决的是一个应用访问多个资源服务器

465109835 commented 5 years ago

但是如果我又三个端应用去访问多个资源 . 我在一个前端应用中登录后, 另外一个前端应用应该不能做到单点登录吧

jobmission commented 5 years ago

前端可以cookie等共享token; 前提是你这项目到底是不是完全前后端分离的,前端和后端是不是相互独立

465109835 commented 5 years ago

是互相独立的

jobmission commented 5 years ago

多个前端可以用不同的二级域名来共享cookie中的token,发现token过期就去刷新token

465109835 commented 5 years ago

谢谢谢谢... 被这个问题困了三天了.. 非常感谢 应该可以解决了