作者回复: jwt是无状态自包含自验证,实现比较轻量,目前业界蛮流行的,很多应用采用jwt,因为大部分应用场景安全并不非常严格,另外jwt也可合理缩短有效期,或在网关上进一步定制加强安全验证。
作者回复: oauth2是一个授权框架和规范,这个规范试图覆盖主要的微服务安全场景(第三方访问,无线应用,企业内部应用),目前在第三方访问和无线应用用得比较多,企业内部(包括内部微服务间调用)其实没有这么严格,各种不同做法(传统token,key,用户名/密码,ip黑白名单等)。
作者回复: 谢谢反馈🌹会反馈给极客时间
作者回复: ppt中,网关上的OAuth Filter主要用于access token校验,获取jwt token;服务上的OAuth Filter,主要用于jwt的解释,获取用户和权限等信息,填充SecurityContext类似构件。用户权限在哪里做?既可以在网关上集中做,也可以在服务端自己做,都能做到,各有优劣,视企业和架构上下文选择即可。
作者回复: 传统单块web应用常用session式会话,现代微服务一般用基于令牌的分布式会话。令牌token有有效期,可在资源端(或通过网关集中)通过授权服务器集中校验,过期校验不通过。如果用jwt令牌,内含过期时间,资源端可自校验。
作者回复: token正常过期用户一般需重新登录获取新令牌,也可采用refreshtoken直接获取新令牌。
作者回复: 按oauth2标准做法,内部服务间调用可以采用客户凭证方式(client credentials)获取令牌并访问目标服务,服务端校验令牌。如果用简单做法,可以做白名单,在网关或服务器端过滤。还有一种常见办法,生产环境隔离。
作者回复: 加油!
作者回复: Spring Cloud Gateway比较新,这个我还没有实现过,找了一些样例供你参考,你自己需要进一步调研和尝试:
https://github.com/artemMartynenko/spring-cloud-gateway-oauth2-sso-sample-application
https://github.com/spring-cloud-samples/sample-gateway-oauth2login
https://github.com/spring-cloud/spring-cloud-gateway/issues/179#issuecomment-406238177
作者回复: 1,如果网关做了集中校验,后台服务再自校验并非必须,假设网关和后台服务在同一个信任域。但也有公司网关和后台服务可能并不一定完全信任,或者后台服务安全特别敏感(比如交易相关),需要严格再次校验。
2, jwt有个问题是令牌里头编码的信息是可见的,有些场景下,不想让用户端看见jwt里头信息(比如用户名角色等),所以对外可以用透明令牌,对内可以再转成jwt。
作者回复: 你好,1,如果采用网关统一认证,那么所有API请求必须经过网关,这个在物理部署架构上可以做到。2,access token换成jwt token,是因为传统访问令牌access token一般是无意义的随机字符串,一般不包含用户名/角色等用户信息(后台服务通常需要这些信息),转成jwt的话,里头可以包含这些信息。当然也可以不转jwt,直接把用户名等信息通过HTTP Header往后传递,更简单一点。
作者回复: 内部调用(定时任务之类),可以采用OAuth2的客户端模式(client credentials),由机器直接发起,不需要人的参与。当然,对于内部调用,你也需要评估是否需要oauth2这种较严格安全授权机制,毕竟会引入很多复杂性。
作者回复: 其实acces token没有应用的和用户的之分,它是授权服务器授予应用(正式叫客户应用)的凭证,通过这个凭证应用就可以代表用户去访问用户的资源,这个是官方定义。实际应用中,企业一般会基于oauth2协议做一些定制扩展,微信的做法我认为就是一种定制扩展。
作者回复: 对,方案3主要就是增加redis缓存,提升令牌校验性能,因为网关集中校验令牌会比较频繁。
作者回复: 不用经网关,直要能通过http header往后传递即可,比如在spring中很容易做到,比如从request context里头获取jwt,通过http client再以http header方式往后传递。
作者回复: oauth2就是针对无线/单页/第三方等场景访问微服务而设计的授权协议。如果自己实现,具体实现哪几种授权方式,可根据需求定。也可基于spring security oauth2等组件扩展,它内置已实现4种主要的oauth2授权方式。
作者回复: 恩,最后一个模块(第9模块),会有一个综合案例,会讲解oauth2服务器和zuul网关的集成,使用类似第三种方案,网关集中验令牌,验通过则将用户信息向后台服务传递
作者回复: 你好,你的回复很长,应该对oauth2有自己的理解和思考,如需进一步交流,可以加我微信号bulldog2015(注明来自极客时间的客户)。我这边简单回复几点:1)refresh token一般只在授权码模式才有,OAuth Client Web服务器需要保存相关映射关系(比如可以存用户表中),主要目的是避免用户每次都要走一个完整的授权码模式流程去获取access token,这个很烦,refresh token可以简化这个流程,Web服务器后台用refresh token自动获取新的access token。2)在授权码模式中,access token/refresh token只在OAuth Client Web服务器上,一般不会流到用户浏览器User Agent上去,保证安全性,3)在通过网关集中校验token的场景中(方式一和三),有了access token后,jwt确实没有特别必要的,很多公司通过access token校验后,直接获取用户信息(比如userId),直接向后台服务传递,没有必要jwt,这个在视频中也有说明,如果使用jwt也可以,对内部服务调用会更规范和安全,当然成本更高一点。
作者回复: 谢支持🌹加油💪
作者回复: access token如果是bearer的话,就像钱一样,别人偷走也可以用的,没有绝对的安全,一般传输层用https防截取,然后缩短token过期时间到安全可接受范围。