【发布时间】:2016-03-09 22:45:21
【问题描述】:
在这种情况下你可以实现“授权码流程”吗?
www.app.com
中的单页应用www.backend.com
中的 REST 后端是否可以通过javascript获取“授权码”,然后将其传递给“后端”以获得“访问令牌”?
【问题讨论】:
在这种情况下你可以实现“授权码流程”吗?
www.app.com
中的单页应用www.backend.com
中的 REST 后端是否可以通过javascript获取“授权码”,然后将其传递给“后端”以获得“访问令牌”?
【问题讨论】:
理论上,在 JS/移动/桌面应用程序中使用授权代码流(或混合流)绝对是可能的,您甚至不需要为此存储客户端凭据(当然可以,但是提取它们是如此容易,以至于毫无意义)。
与普遍看法相反,在使用授权代码流时,“公共”应用程序(即无法安全存储其凭据的应用程序,包括 JS 应用程序)不需要客户端身份验证:
如果客户类型是保密的或客户是发给客户的 凭据(或分配的其他身份验证要求), 客户端必须按照所述向授权服务器进行身份验证 在第 3.2.1 节中。
https://www.rfc-editor.org/rfc/rfc6749#section-4.1.3
如果客户端是机密客户端,则它必须使用为其 client_id 注册的身份验证方法向令牌端点进行身份验证,如第 9 节所述。
http://openid.net/specs/openid-connect-core-1_0.html#TokenRequest
在实践中,我很确定大多数授权/身份验证服务器在使用授权代码流时会强制执行客户端身份验证,而是建议对公共应用程序使用隐式流。
如果您的授权服务器支持这种情况,如果您使用response_mode=query(或更好:@Hans 建议的response_mode=fragment),在您的 JS 应用程序中使用授权代码流应该很容易,因为您可以使用您的 JS main页面为redirect_uri,并使用一些JS从查询字符串或片段中提取授权码。
【讨论】:
这可以通过将redirect_uri 设置为您的SPA 中的某个位置,从授权响应中获取code(使用How to get the value from the GET parameters? 中描述的任何方法)并将其传递到特定于应用程序的后端方法。使用 OpenID Connect 时,可以选择在 redirect_uri 的片段中传递 code,这比将其作为查询参数传递具有一些安全优势。
【讨论】: