针对OAuth2学习中的一些高频问题。相信很多初学者对OAuth2都有一些疑问。胖哥把这些问题一一收集起来做成QA,希望对学习者有所帮助。OAuth2相关QAQ:OAuth2的一些常见场景?A:OAuth2主要用于API授权,是一种跨API服务间授权的解决方案。适用于单点登录(SSO)、微服务间授权认证、API开放平台等场景。问:什么是OAuth2客户端?A:OAuth2客户端在OAuth2授权服务器上注册为客户端,获得专属的client_id标识。Android应用、IOS应用、Web前端等客户端应用也必须遵循这个原则。只有当他们自己向OAuth2授权服务器注册时,他们才能成为OAuth2客户端。否则,它们不是OAuth2客户端。他们必须是他们自己,而不是支持他们的后端。服务。Q:为什么OAuth2clients分为public和confidential两种,分别有哪些场景?A:rfc6749#section-2.1根据OAuth2客户端自身是否具有维护客户端凭证(clientcredentials)隐私的能力,以及能否通过授权服务器安全认证客户端的资质,将OAuth2客户端分为机密客户和客户。公共客户端。大多数后端数据服务应注册为保密客户;那些不能保证自己凭证安全的人应该注册为公共客户。公共客户端没有client_sercet,直接注册到OAuth2授权服务器的执行客户端。那些不通过后端应用中继访问令牌的是公共客户端,例如在某些特定场景下需要直接连接到授权服务器的Web应用和移动应用。Q:OAuth2的access_token和refresh_token是不是应该直接返回给前端?A:能否返回给前端取决于前端是否直接在授权服务器的OAuth2客户端上。否则,它不能保存access_token和refresh_token。access_token和refresh_token的颁发对象只能是OAuth2客户端。如果裸露的一面敞开着,很容易被盗。Q:非OAuth2客户端的客户端应用不能直接持有access_token和refresh_token,那么应该如何获取授权状态呢?A:授权成功后,可以借助session或cookie将token与用户客户端进行映射。当然,也可以考虑不透明令牌(OpaqueToken)映射,这取决于业务考虑。问:OAuth2中的范围是什么?答:OAuth2是一个授权框架。授权自然需要一个范围,保证OAuth2客户端在既定范围内行动,不越界。其作用类似于RBAC中的作用,用于限制资源的访问权限。角色是针对资源所有者(ResourceOwner)的,范围是针对OAuth2客户端的。当然还有一个例外openid,它是OIDC1.0的标识符,是关键字。Q:OAuth2中的登录页面和授权确认页面是否可以前后端分离?A:很多开发者不希望在点击授权的时候被302重定向到授权服务器提供的登录页面,但是你要明白一个道理,OAuth2客户端和授权服务器之间并不存在完全信任关系.外卖小哥给你送外卖,你肯定想发一个临时门禁密码,而不是普通密码。另外ajax不能安全处理OAuth2授权过程中的302重定向问题,这也是一个技术问题。Q:OAuth2客户端可以做用户认证吗?A:OAuth2本身并没有定义用户如何向OAuth2客户端进行认证,应该与授权服务器上的用户认证区别开来。OAuth2客户端在授权完成后可以拿到授权凭证,但是不能直接拿到用户信息。如果授权服务器提供了获取用户信息的资源接口,OAuth2客户端可以尝试通过该接口获取用户信息,以表明用户的身份。身份,这取决于用户是否已授权OAuth2客户端这样做。OIDC1.0补充定义了用户OAuth2客户端认证的详细流程。问:什么是OAuth2客户端身份验证?A:虽然机密类型的OAuth2客户端是在OAuth2授权服务器注册的,但是必须根据一些策略(ClientAuthenticationMethod)向授权服务器证明自己是合法客户端。这样他们就可以调用一些OAuth2指定的端点,比如/oauth2/token令牌端点,/oauth2/revoke令牌撤销端点等等。关于OAuth2客户端认证的详细信息,请参考OAuth2客户端认证过滤器详解。Q:为什么OAuth2密码模式被废除了?A:准确的说,目前的password模式在OAuth2.1已经被去掉了,知名的第三方授权服务机构包括OAuth0、okta都已经去掉了password模式。密码模式诞生的时候,像React、Vue这样的单页应用还没有出现,甚至还没有框架。它更像是解决遗留问题的过渡解决方案。在传统应用中,用户习惯于直接将密码交给客户端来换取资源访问权限,而不是跳来跳去地请求授权和确认授权。OAuth2诞生的时候,这个模型就是为了让用户从传统的思维中慢慢转变而来的。破坏了委托授权模型,降低了OAuth2的安全性。更详细的可以参考我之前的相关文章。Q:OAuth2中的资源服务器呢?A:服务器只要包含需要OAuth2客户端携带access_token访问的资源接口,就可以认为是资源服务器,包括OAuth2客户端和OAuth2授权服务器,可以承担资源的功能服务器根据业务和架构。从用户(资源拥有者)的角度来看,任何存储了用户可以授权的资源接口的服务器都可以是资源服务器。资源服务器可以解码验证访问令牌access_token,判断请求是否合规。Q:微服务可以不使用OAuth2吗?当然,OAuth2只是目前微服务访问控制方案中的一种,并不是唯一的选择。总结一下,就是最近胖哥被问的比较多的一些问题,相信可以帮到你。OAuth2的事情并不简单。经过近三年断断续续的学习,胖哥对这个东西已经完全明白了,各位学习者不要心急。学习无聊的时候,暂时放下。学习这个最重要的是理解它。OAuth2的概念和流程远比各种框架重要。OAuth2本身与语言无关。关注公众号:Felordcn获取更多资讯个人博客:https://felord.cn
