CF2021中CFOAUTH因redirecturi跳转无法获取认证结果的问题咨询
解决CFOAUTH跳转后无法获取认证结果的问题
核心原因
你使用的是授权码流程(response_type=code),CFOAUTH的result变量仅在发起认证的页面(即调用<cfoauth>的页面)有效。但认证成功后,授权服务器会直接跳转到redirecturi指定页面,原页面的authResult不会被携带到跳转页面,且原页面后续代码因跳转无法执行。
具体解决方案
1. 拆分认证流程为两个页面
将认证发起与结果处理分离:
- 页面1(发起认证):仅负责调用
<cfoauth>触发跳转,无需处理结果 - 页面2(
redirecturi指定的index.cfm):接收授权服务器返回的code参数,手动调用token接口换取访问令牌
2. 保留发起认证页面的代码
原<cfoauth>调用无需修改,但要移除后续依赖authResult的代码(跳转后这些代码不会执行):
<cfoauth clientid="client.userprofile" scope="app.client.userprofile" authendpoint="https://www.authorization-location.com/connect/authorize" accesstokenendpoint="https://www.authorization-location.com/connect/token" result="authResult" redirecturi="https://www.my-location.com/appname/index.cfm" urlparams="code_challenge=abcxyz&code_challenge_method=S256&response_type=code" />
3. 在index.cfm中处理授权码
授权服务器跳转回来时,会在URL中携带code参数,按以下步骤处理:
<!--- 检查是否有授权码返回 ---> <cfif structKeyExists(url, "code")> <cfset code = url.code> <!--- 注意:code_verifier必须和生成code_challenge的原始值一致,建议发起认证时存入session ---> <cfset codeVerifier = session.codeVerifier> <!--- 调用token接口换取访问令牌 ---> <cfhttp url="https://www.authorization-location.com/connect/token" method="POST"> <cfhttpparam type="formfield" name="grant_type" value="authorization_code"> <cfhttpparam type="formfield" name="client_id" value="client.userprofile"> <cfhttpparam type="formfield" name="redirect_uri" value="https://www.my-location.com/appname/index.cfm"> <cfhttpparam type="formfield" name="code" value="#code#"> <cfhttpparam type="formfield" name="code_verifier" value="#codeVerifier#"> <!--- 若客户端为保密类型,需添加client_secret参数 ---> <!--- <cfhttpparam type="formfield" name="client_secret" value="你的客户端密钥"> ---> </cfhttp> <!--- 解析返回的JSON结果 ---> <cfset authResult = deserializeJSON(cfhttp.fileContent)> <!--- 此时可使用authResult中的access_token等信息 ---> <cfdump var="#authResult#"> <cfelse> <!--- 处理认证失败或正常访问的情况 ---> <cfif structKeyExists(url, "error")> <p>认证失败:#url.error# - #url.error_description#</p> </cfif> </cfif>
关键注意事项
- code_verifier一致性:发起认证时生成
code_challenge的原始code_verifier必须妥善保存(如存入session),换取token时需传入相同值,否则会验证失败 - 客户端认证:如果你的客户端是保密类型,调用token接口时需添加
client_secret参数,注意不要暴露在前端 - 错误处理:跳转页面要捕获
error、error_description等参数,处理认证失败场景
补充说明
CFOAUTH的result变量仅在**隐式流程(response_type=token)**下会通过URL哈希传递到跳转页面,但该流程安全性较低,不推荐用于生产环境。你当前使用的授权码流程是标准安全流程,必须通过手动调用token接口获取结果。
内容的提问来源于stack exchange,提问作者Spoony
相关产品推荐
相关产品推荐

