Auth Code with PKCE

Auth Code + PKCE 是一个 OpenId Connect流程,专门为public client应用(包括native移动应用或浏览器one page应用)设计的身份验证流程。

PKCE,发音为“pixie”,是 Proof Key for Code Exchange 的缩写。 PKCE 和Auth Code flow之间的主要区别在于 PKCE 不需要client secret。它是对Auth Code的加强扩展并用于取代Implicit流程。

Public client的安全隐患

Native移动应用

无法安全地存储client secret,因为反编译应用程序就可以取得client secret,这个client secret还被绑定到应用程序并且对所有用户和设备都是相同的。

原生应用可能会利用自定义 URL 方案来获得系统重定向(例如 MyApp://),从而可能让恶意软件利用并拦截这个重定向而获得auth code。

One page应用

无法安全地存储client secret,因为浏览器可以下载整个源代码。

工作方式

PKCE引入了由应用创建的secret,这个secret称为Code Verifier。授权服务器可以在签发access token时验证这个secret。此外,应用还会创建一个从Code Verifier计算出来来的一个字符串,名为“Code Challenge”,并通过 HTTPS 发送该字符串来索取auth code。这样,恶意程序只能拦截auth code,但无法在没有Code Verifier的情况下获取access token。