Salesforce User Agent Flow 授权流程详解

核心概念 (What is it about?)

这是OAuth 2.0的一种授权流程,专为无法安全存储"客户端密钥"的应用程序设计,例如:

  • 原生桌面应用
  • 移动应用 (iOS/Android)
  • 直接在浏览器中运行的客户端应用 (如 JavaScript 单页应用)

在这种流程中,用户授权应用程序访问其受保护数据(如Salesforce中的联系人信息)。

为什么用这个流程?(关键特点)

  1. 无客户端密钥 :由于应用运行在用户设备上(如手机、电脑),其代码和"客户端密钥"可能被反编译或检查,无法保密。因此,此流程不要求使用客户端密钥进行身份验证。

  2. 通过用户代理进行授权 :授权过程通过一个外部或内嵌的浏览器 完成。用户在这个浏览器中直接登录Salesforce并进行授权,应用本身永远看不到用户的密码

  3. 令牌通过URL片段传递 :授权成功后,访问令牌(access_token)以 URL哈希片段 (#后面的部分) 的形式,通过浏览器重定向返回给应用。

    • 好处:URL片段不会发送到服务器,只在浏览器本地处理,因此不会在服务器日志或Referer头中泄露令牌。
    • 风险:令牌仍会出现在浏览器的地址栏和浏览历史中,可能被同一设备上的其他应用或用户窥探。

流程步骤 (简单描述)

想象你开发了一个手机App,需要读取用户Salesforce里的客户联系人:

  1. 启动:用户在手机上打开你的App。
  2. 重定向至授权 :App打开一个浏览器(或WebView),并将用户重定向到Salesforce的授权端点 (.../oauth2/authorize)。
  3. 用户登录和授权:用户在浏览器中看到一个页面询问"是否允许此App访问你的数据?",用户点击"允许"。
  4. 回调并接收令牌 :Salesforce将浏览器重定向回你预先注册的回调地址 (Redirect URI),并在URL的#后面附上访问令牌和其他信息。
  5. 提取令牌并访问数据:你的App从URL中提取出访问令牌,之后就可以用这个令牌调用Salesforce API,代表用户获取或操作数据。

重要警告与建议

  • 安全性提示 :Salesforce推荐 使用更安全的 OAuth 2.0 Web服务器流程(带PKCE) 来代替用户代理流程。PKCE(Proof Key for Code Exchange)能提供更好的安全保护。
  • 可被禁用 :管理员可以选择阻止用户代理流程,但这可能会破坏许多使用此流程的现有移动App(包括Salesforce自己的官方移动App)。

授权请求与响应的关键参数

  • 请求授权时的URL参数

    • response_type=token:表明使用隐式流程,直接请求令牌。
    • client_id:你的应用的"消费者密钥"。
    • redirect_uri:授权成功后的回调地址,必须与应用设置中完全匹配。
    • scope:请求的权限范围(如apirefresh_token)。
  • 授权成功后的响应参数 (在#后面,可能需要进行转移如%20):

    • access_token:最重要的令牌,用于访问API。
    • refresh_token:仅在某些特定条件下颁发(如特定回调URL或请求了scope=refresh_token),用于获取新的访问令牌。
    • instance_url:用户所属Salesforce组织的实例地址。
    • state:用于防止跨站请求伪造攻击的一个随机值,需与请求时发送的值比对。

第三部分:与其他流程的对比

为了让你更清楚"用户代理流程"的定位,这里有一个简单对比:

特性 OAuth 2.0 用户代理流程 (本文档内容) OAuth 2.0 Web服务器流程 (更推荐)
适用场景 手机App、桌面App、浏览器单页应用(JavaScript) 有自己后端的传统网站(如PHP, Java, .NET应用)
客户端密钥 不使用(因为无法在设备上安全存储) 使用(可以安全存储在后端服务器)
令牌返回方式 直接返回access_token(隐式),通过URL片段(#) 先返回一个code,客户端再用codeclient_secret去换access_token
安全性 较低。令牌易暴露在浏览器中。 较高。令牌永远不会经过用户浏览器。
推荐度 不推荐(遗留方案) 。文档明确指出,为了加强安全,应使用带PKCE的Web服务器流程。 推荐(现代方案) 。PKCE扩展使其也能安全地用于手机App和单页应用。
相关推荐
烂蜻蜓1 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055978 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿9 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909610 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理12 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒12 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构13 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构13 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构13 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常14 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端