在新创建的Salesforce Scratch Org中使用主组织Connected App的问题
CI/CD流程中Scratch Org的JSForce连接问题
需求
在CI/CD流程中完成:创建Scratch Org → 通过JSForce连接并执行Node服务查询 → 销毁Scratch Org
已尝试方案及问题
- 方案1:通过CI/CD用主组织元数据新建Connected App
- 问题:无法自动获取应用ID和密钥
- 方案2(优先尝试):让Scratch Org用户使用主组织的Connected App
- 问题:应用已在用户「OAuth Apps」列表中,但用Connected App凭证+用户凭证访问时返回
invalid grant
- 问题:应用已在用户「OAuth Apps」列表中,但用Connected App凭证+用户凭证访问时返回
- 方案3:不使用Connected App
- 问题:无法自动获取安全令牌附加到密码中
主组织Connected App配置
<isAdminApproved>true</isAdminApproved> <isConsumerSecretOptional>false</isConsumerSecretOptional> <isIntrospectAllTokens>false</isIntrospectAllTokens> <isSecretRequiredForRefreshToken>false</isSecretRequiredForRefreshToken> <oauthPolicy> <ipRelaxation>BYPASS</ipRelaxation> <refreshTokenPolicy>infinite</refreshTokenPolicy> </oauthPolicy> <permissionSetName>Synchronizer Access</permissionSetName> <profileName>System Administrator</profileName>
注:必须将
isAdminApproved设为true才能正常工作,主组织已配置应用访问权限。
额外问题
执行sf org create scratch返回的访问令牌无法用于JSForce连接,疑似不具备API访问用途。
Scratch Org配置
"features": ["EnableSetPasswordInApi", "API", "AuthorApex"], "settings": { "lightningExperienceSettings": { "enableS1DesktopEnabled": true }, "apexSettings": { "enableCompileOnDeploy": true }, "OauthOidcSettings": { "blockOAuthUnPwFlow": false } }
解决方案
1. 直接使用Scratch Org创建时的会话令牌连接JSForce
sf org create scratch返回的accessToken和instanceUrl是有效的API会话凭证,无需Connected App即可直接连接,这是CI/CD中最便捷的方式:
const jsforce = require('jsforce'); // 从CI/CD环境变量读取sf返回的参数 const conn = new jsforce.Connection({ instanceUrl: process.env.SCRATCH_INSTANCE_URL, accessToken: process.env.SCRATCH_ACCESS_TOKEN }); // 执行查询示例 conn.query('SELECT Id, Name FROM Account', (err, result) => { if (err) throw err; console.log('查询结果:', result.records); });
提示:创建Scratch Org时可以用
--json参数输出结构化结果,方便CI/CD工具提取环境变量:sf org create scratch -f config/project-scratch-def.json --json > scratch-org-info.json
2. 修复方案2中的invalid grant问题
如果必须使用主组织的Connected App,排查以下几点:
- 确保权限分配同步:Scratch Org用户必须分配Connected App配置中指定的
Synchronizer Access权限集或System Administrator配置文件。CI/CD中添加命令自动分配:sf assign set-permission-set -n "Synchronizer Access" -u <scratch-org-username> - 验证OAuth设置:确认Scratch Org的
blockOAuthUnPwFlow确实为false,可以用sf org display -u <scratch-org-username> --verbose检查配置。 - 获取安全令牌:若使用密码+令牌方式,创建Scratch Org时设置密码后,通过
sf org generate token -u <scratch-org-username>获取安全令牌,再组合密码(密码+令牌)用于JSForce的用户名密码登录:const conn = new jsforce.Connection(); conn.login(username, `${password}${securityToken}`, (err) => { if (err) throw err; // 执行查询 });
3. 销毁Scratch Org
流程结束后执行销毁命令:
sf org delete scratch -u <scratch-org-username> -p
内容的提问来源于stack exchange,提问作者charlescol
相关产品推荐
相关产品推荐

