作者回复: 不错⛽️
作者回复: 回复你的一些问题: 1. IDP就是基于OAuth2的授权服务,比方说可以采用Spring Security OAuth2来实现IDP。IDP可以自己实现登录认证的逻辑,也可以把登录认证的逻辑委派给其它服务,比方说独立的Login Service来实现。Spring Security OAuth2的登录认证逻辑就是可以plugin的,可以委派给其它服务来实现。 2. 网关和IDP没有直接的client关系,只是IDP需要支持一些API端点,网关可以通过这些端点来实现:1)令牌校验,2)获取对应的JWT令牌。 3. 登录使用手机号+验证代码,这是一种具体的基于双因素的认证方式,其实OAuth2本身只是要求用户在授权获取令牌前先进行登录认证,具体登录认证的方式它并不关心。Spring Security OAuth2的登录认证方式也是可以plugin的,你可以用默认的用户名密码方式,也可以定制为手机号+验证码方式。实际上Spring Security OAuth2就是基于Spring Security开发的,你只需要定制Spring Security来实现基于手机号+验证码的登录认证方式就可以。
作者回复: JWT是自包含令牌,里头可以包含一部分用户信息,全程使用JWT也可以,JWT内部的数据本身只是加签防篡改,本来就是客户端可见的,一般服务器端启用HTTPS就可以了,再做一次加密意义并不大。 相比JWT,普通访问令牌机制还有一个好处,就是可以集中吊销令牌,而JWT一般需要等到自然过期,因为它是自校验的。
作者回复: BFF虽然是前端开发,但是它也是一种聚合API,所以它理应放在API网关后面,这样就可以统一通过网关实现反向路由,限流熔断,日志监控等功能。 所以BFF一般不放在API网关层前面,静态资源一般放在API网关层前面。 也有一些企业的做法是BFF聚合逻辑直接写在网关上的,这种在企业规模不大、BFF逻辑不复杂时也可以采用,可以节省硬件资源。
作者回复: 你说的应该是DMZ非军事区网络吧,在传统数据中心,在外网和内部受信网络之间一般有一个DMZ网络,这里头部署防火墙/反向代理/网关等可以增加各种安全防范措施。参考: https://en.wikipedia.org/wiki/DMZ_(computing) DMZ可以是物理的,也可以是逻辑的,在上文的架构图中,防火墙+Ingress+Gateway也可以算是在DMZ区内,可以增加各种安全措施。
作者回复: 网站会话有几种做法,一种是Session数据都存在服务器端,客户端浏览器cookie中只存sesssionID,我把这种称为Web Session,这种是服务器端有状态的Session技术。另外一种是Session数据都存在浏览器cookie中,我把这种称为客户端Session,这种是服务器端无状态的Session技术。
作者回复: 不错
作者回复: APP用用户名密码模式,通过native界面登录,这是一个一步流程,并且APP上要存clientId+secret,黑客可以破解app获取clientId+secret,然后通过猜测轮训你的post登录接口偷取用户密码。 APP上的浏览器方式走的是一个3-legged完全OAuth2授权码流程,比较安全,很难被黑客利用,而且浏览器方式容易增加验证码和双因素等更安全校验机制。 请参考下文的第7点:Security Consideration https://www.kaper.com/cloud/micro-services-architecture-with-oauth2-and-jwt-part-3-idp/
作者回复: 移动端原生App也可以采用OAuth2的授权码模式(建议采用支持PKCE的增强型授权码模式),这时候可以在App中以嵌入方式启动手机浏览器,走授权码申请流程,等IDP 返回授权码到 App 浏览器之后,App 可以截取浏览器带回的授权码,然后App可以继续走后面令牌获取的流程。 所以这个流程App需要借助手机上的浏览器这个中介,来走完OAuth2的授权码流程,这个是目前针对原生App采用OAuth2协议的推荐做法。 具体参考本文的[场景 2:第一方移动应用 + 授权码许可模式]的描述。 额外参考: https://auth0.com/blog/oauth-2-best-practices-for-native-apps/ https://auth0.com/docs/flows/authorization-code-flow-with-proof-key-for-code-exchange-pkce
作者回复: 企业根据具体场景,需要定义一个scope和API之间的权限关系表,这个表需要单独维护,并且可以缓存在网关上,加快网关的校验。所谓校验,就去查这张表,看某个scope能否访问某个API。 scope和authority并没有所谓官方定义,你可以根据上下文赋予它们具体的语义。