作者回复: 在这种code_challenge_method=plain情况下,code_verifier的值和code_challenge的值是一样的。 我们首先要清楚PKCE的出现是为了解决,客户端如果不想使用服务端来支持,在失去了secret的保护下,怎么让OAuth 2.0 进行的更安全,实际上是为了防止授权码被截获,授权码的截获是发生在授权服务响应客户端【第一次】请求授权码的这个过程里面。 在code_verifier的值和code_challenge的值是一样的情况下,是做了一个最基本的校验,当客户端【第二次】拿着授权码code和code_verifier来请求access_token的时候,授权服务会判断这次给的code_verifier和上次给的code_challenge值是否一致,如果不一致,拒绝返回access_token。 code_challenge_method=plain、code_challenge_method=S256、给客户端增加一个服务端支持,这三种情况的安全等级是逐渐增高的。 安全问题的发生是一个组合问题,安全问题的防护是一个成本问题。
作者回复: PKCE机制可以【减轻】针对授权码截获的攻击,公共客户端固有的局限性PKCE并不能解决,所以它起不到secret的作用。 另外,PKCE是OAuth 2.0的一个增补协议可以单独使用,也可以组合使用,比如,如果在具备保存secret的环境里面已经使用授权码流程的基础上再增加PKCE的支持,将会进一步增强授权码流程的安全性。
作者回复: 移动端类应用,目前各大开放平台都是要求必须有第三方的服务端的支持,由第三方的服务端来跟平台做交互通信。2012年10月发布了OAuth 2.0 的正式授权协议框架,也就是官方的RFC 6749,在2015年9月增补了PKCE协议,也就是官方的RFC 7636。PKCE发布的目的是为了缓解针对公开客户端的攻击,主要是解决授权码窃听的攻击。
作者回复: 移动App类应用不像Web应用或者浏览器应用那样可以让用户通过浏览器来访问,如果为了实现这样的方式,可以尝试的做法是需要移动App类应用能够访问操作系统上的浏览器,为了能够监听到这个前端的响应,还需要通过一个URI提供服务,可以通过一个微型的内嵌在应用内、运行在localhost上的Web服务器。
作者回复: PKCE是OAuth 2.0 的一个增订”协议“,来解决【公共客户端】授权码可能遭劫持的问题。公共客户端无法保存配置时的秘钥等信息。Web应用有自己的服务端支持,可以很好的解决秘钥的保存问题,所以Web应用是不建议这样做的,而且移动App也不建议这做我们课程中给出了建议。如果你确实不需要一个服务端的移动App可以尝试这样的方式,PKCE是RFC 7636的内容。
作者回复: 介绍PKCE的时候是为了突出流程,就么有画出用户的角色,生成code_verifier和code_challenge都是在用户点击授权之后产生的,所有的授权流程包括之前讲的授权码等等,都是发生在用户点击了授权按钮之后,才发生的,用户的授权肯定都是在平台上面进行,所以平台一定能够拿到用户的登录态。
作者回复: 可以
作者回复: 存在服务端,有一个专有的秘钥服务器,但只用户登录之后换回access_token然后才可以去请求或者操作【带有用户属性】的数据。
作者回复: 可以理解为PKCE是一种增强
作者回复: 微信提供的联合登录肯定是OAuth,至于微信app自身内部使用了什么,这个还需要再确认。