Vector6662 / jap

JAP is an open source authentication middleware, it is highly decoupled from business code and has good modularity and flexiblity. Developers could integrate JAP into web applications effortlessly.
https://justauth.plus
GNU Lesser General Public License v3.0
0 stars 0 forks source link

开发 springboot starter 依赖包 #1

Open Vector6662 opened 3 years ago

Vector6662 commented 3 years ago

Q:看了SessionUserStore的源码,里面的save()将JapConst.SESSION_USER_KEY作为key,然后get()也是根据JapConst.SESSION_USER_KEY取得japUser的。但这样的话session只能保存一个japuser实例了吧,也就是说如果登录过一次,后面不管登录多少次都只会返回第一次登陆的登录信息

A: 这个就谈到 session 的生命周期了。一次会话理论上应该就是只保留一个用户信息的。你可以把 Session 理解为 ThreadLocal,每次会话相当于一个线程。session 之间是数据隔离的,不会影响到其他人。

Q:同一个客户端发来的request在服务器对应的session是一个,可以这么理解吗

A:不准确,需要再加一点修饰。同一个客户端发来的request在服务器「在一段时间内」对应的session是一个,因为 session 有默认的存活时间,过期了,就会重新创建一个。

Vector6662 commented 3 years ago

创建四种Strategy类的单例,交由bean容器管理。提供两种方式指定创建strategy实例所需的JapUserService对象:

  1. JapUserService的实现类上使用注解:@Service(JapServiceType.SOCIAL)
  2. application.properties中配置:jap.simple-user-service = com.fujieid.jap.spring.boot.starter.service.JapSimpleUserServiceImpl,指定该service类的binary name。

目前实现了两个特性:

  1. 考虑到开发者可能只采用四种策略的其中几种进行认证,故创建四种strategy类的单例时允许暂时不指定JapUserService实现类。
  2. 考虑到每一次请求上下文是与当前线程绑定的,因此在JapStrategyFactory提供的API中都不必开发者显式传递requestresponse参数。

socialStrategy为例,展示三种主要的调用方式:

@Autowired
JapStrategyFactory japStrategyFactory;
@Autowired
JapProperties japProperties;
@Autowired
SocialStrategy socialStrategy;

方式一

japStrategyFactory.authenticate(Strategy.SOCIAL);

方式二,若采用的策略尚未指定JapUserService,可调用此方法。但不允许重复指定JapUserService实现。

japStrategyFactory.authenticate(Strategy.SOCIAL,socialUserService);

方式三

socialStrategy.authenticate(japProperties.getSocial(), request, response);

代码已经提交gitlab,请老师过目并提出宝贵意见!😁

Vector6662 commented 3 years ago

完成五个starter的模块化开发,创建了jap-spring-boot-starter-demo项目测试了部分strategy。目前的问题是当前模块化方式是否合理❓ 以simple strategy为例,创建了jap-simple-spring-boot-starter模块,里边只有一个@Configuration注解的配置类:SimpleAutoConfiguration,该类只负责向bean容器中注入一个bean对象:SimpleStrategy。这样做的一个优点是,只有开发者引入了jap-simple-spring-boot-starter模块的maven依赖,才能使用这个simple策略。 然而发现的问题是,这四个strategy的配置信息都在jap-spring-boot-starter这个模块中,而每个像jap-simple-spring-boot-starter这样的strategy自己的模块只负责创建自己的bean,个人的设想是每个strategy的模块中应该还要包含该类的配置信息,但随之而来的问题是,没有找到很好的方法集成到JapTemplate中,但目前还在尝试。

xkcoding commented 3 years ago

你看能否抽取公共配置到一个 common( 模块名字看你喜好,也可以叫做config ) 模块下,然后其余模块依赖 common 模块,先研究能否抽取公共配置~

我看了下你的代码,其实你是把配置等信息放在 jap-spring-boot-starter 模块下的,这一块我觉得是否可以参考下官方的 spring-boot-starter-jpa 模块,看看他是怎么设计的?

@zhangyd-c 亚东也可以给点意见~

Vector6662 commented 3 years ago

你看能否抽取公共配置到一个 common( 模块名字看你喜好,也可以叫做config ) 模块下,然后其余模块依赖 common 模块,先研究能否抽取公共配置~

我看了下你的代码,其实你是把配置等信息放在 jap-spring-boot-starter 模块下的,这一块我觉得是否可以参考下官方的 spring-boot-starter-jpa 模块,看看他是怎么设计的?

@zhangyd-c 亚东也可以给点意见~

好的,我去看看!

Vector6662 commented 3 years ago

测试oauth策略的时候发现OauthStrategy.authnticate(...)有这么几行:

image

即每次授权之前都会检查当前session中是否有用户,如果有的话则直接返回这个japUser。但是设想这样的场景:一个用户在同一个浏览器先后用Gitee和GitHub授权给我的应用,但在进行GitHub授权的时候session中已经有了前一次gitee授权的信息,这样是否会形成干扰?

@xkcoding @zhangyd-c 感谢两位老师!

Vector6662 commented 3 years ago

对oauthStrategy测试了一下,发现用GitHub的Oauth得到的返回值是这样的:

access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&token_type=bearer

明显不是json格式,但要将其解析成json格式: image

会报错。是否需要在请求的header上加上:Accept:application/json呢?

xkcoding commented 3 years ago

问题 1:流程:新用户:登录-绑定-退出

问题 2:是的,现在是需要加上 Accept: application/json 才会返回 json 数据,这块我记得之前的是默认返回 json 的,可能 GitHub 做了调整

zhangyd-c commented 3 years ago

测试oauth策略的时候发现OauthStrategy.authnticate(...)有这么几行:

image

即每次授权之前都会检查当前session中是否有用户,如果有的话则直接返回这个japUser。但是设想这样的场景:一个用户在同一个浏览器先后用Gitee和GitHub授权给我的应用,但在进行GitHub授权的时候session中已经有了前一次gitee授权的信息,这样是否会形成干扰?

@xkcoding @zhangyd-c 感谢两位老师!

我感觉你这个问题的逻辑可能存在问题,既然已经登录过了,为什么还要重复登录?正确的流程应该是:

  1. 使用 gitee 登录成功
  2. 退出 gitee 登录
  3. 使用 github 登录
Vector6662 commented 3 years ago

测试oauth策略的时候发现OauthStrategy.authnticate(...)有这么几行: image 即每次授权之前都会检查当前session中是否有用户,如果有的话则直接返回这个japUser。但是设想这样的场景:一个用户在同一个浏览器先后用Gitee和GitHub授权给我的应用,但在进行GitHub授权的时候session中已经有了前一次gitee授权的信息,这样是否会形成干扰? @xkcoding @zhangyd-c 感谢两位老师!

我感觉你这个问题的逻辑可能存在问题,既然已经登录过了,为什么还要重复登录?正确的流程应该是:

  1. 使用 gitee 登录成功
  2. 退出 gitee 登录
  3. 使用 github 登录

明白了!确实应该是这样,我的逻辑有问题,谢谢东哥!

Vector6662 commented 3 years ago

问题 1:我研究一下,在更新答案..

问题 2:是的,现在是需要加上 Accept: application/json 才会返回 json 数据,这块我记得之前的是默认返回 json 的,可能 GitHub 做了调整

问题1:谢谢沈老师!我也觉得东哥关于这个问题的回答有道理😄。 问题2:了解!是否需要修改一下jap源码呢?如果需要我可以试着提交一个PR。

xkcoding commented 3 years ago

沈老师我想问一个问题,我看到您写的justauth-spring-boot-starter中这个配置类是abstract的,这样做的目的是什么呢? image

其实我这个是参考 org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration 实现的,当时我在设计 state 缓存的不同实现的时候,发现这个逻辑不就跟数据源选择的逻辑一致么,所以是受他启发的

Vector6662 commented 3 years ago

沈老师我想问一个问题,我看到您写的justauth-spring-boot-starter中这个配置类是abstract的,这样做的目的是什么呢? image

其实我这个是参考 org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration 实现的,当时我在设计 state 缓存的不同实现的时候,发现这个逻辑不就跟数据源选择的逻辑一致么,所以是受他启发的

明白,我去看看!

Vector6662 commented 3 years ago

完成了开发工作,也上传到了GitHub中:https://github.com/Vector6662/jap-spring-boot-starter 。写了使用文档。 这是使用本starter的一个demo:https://github.com/Vector6662/jap-spring-boot-starter-demo 。 @xkcoding 谢谢老师!

zhangyd-c commented 3 years ago

问题 1:我研究一下,在更新答案.. 问题 2:是的,现在是需要加上 Accept: application/json 才会返回 json 数据,这块我记得之前的是默认返回 json 的,可能 GitHub 做了调整

问题1:谢谢沈老师!我也觉得东哥关于这个问题的回答有道理😄。 问题2:了解!是否需要修改一下jap源码呢?如果需要我可以试着提交一个PR。

问题2:这个应该是在 justauth 里面进行修复。可以尝试一下

zhangyd-c commented 3 years ago

另外,https://github.com/Vector6662/jap-spring-boot-starter-demo 这个项目也放到 组织里面吧,开发者用的时候方便找

Vector6662 commented 3 years ago

另外,https://github.com/Vector6662/jap-spring-boot-starter-demo 这个项目也放到 组织里面吧,开发者用的时候方便找

好的!

zhangyd-c commented 3 years ago

ok,已经转过去了

Vector6662 commented 3 years ago

oauth的scope参数为多个的情况下会有如下报错:

Illegal character in query at index 270: 
https://oauth.aliyun.com/v1/token?
code=XXX&
client_secret=XXX&
redirect_uri=http://localhost:8080/oidc/aliyun&
grant_type=authorization_code&
client_id=4408723633922655083&
scope=aliuid openid profiles  #中间用逗号或者空格分隔都会报错

我猜测应该是scope值之间的空格原因,同时 image 这里的encode为false。我测试了一下,如果将encode改为true,就可以请求成功: image

若为false便会报错: image

我的oathConfig实例的scope值如下: image

进行post请求时: image

@xkcoding @zhangyd-c 谢谢两位老师!