【问题标题】:how to get a more permanent access token如何获得更永久的访问令牌
【发布时间】:2015-02-22 23:38:22
【问题描述】:

http://www.salesforce.com/us/developer/docs/api_rest/index_Left.htm#CSHID=quickstart_code.htm|StartTopic=Content%2Fquickstart_code.htm|SkinName=webhelp 的文档说

Salesforce 使用身份验证允许用户安全地访问数据,而无需透露用户名和密码凭据。

但据我所知,我可以运行以获取 access_token 的唯一命令是像这样使用我同事的用户名和密码

curl -d "username=yyyyyyy" -d "password=xxxxxxx" -d "client_id=zzzzzz" -d "client_secret=dddddddddd" -v -d "grant_type=password" https://login.salesforce.com/services/oauth2/token

随着 access_token 不断过期,我必须重新生成它。如果没有,我的同事可以只生成一次令牌并将其交给我并完成它。

我该怎么做才能让他永远不必给我他的用户名/密码,并且我的应用程序将继续工作,直到他从 salesforce 删除应用程序(这可能会使 client_id 和 client_secret 无效)。

(至少大多数 API 都是这样工作的,因此用户不必向开发人员提供他们的用户名和密码,我们也不需要在生产机器上存储用户名和密码。)那么我们如何让它工作呢?或者文档完全错误,我确实需要用户的登录名/密码才能访问数据,即使那一行另有说明。

【问题讨论】:

    标签: salesforce


    【解决方案1】:

    好的,这很烦人。在 OAuth2 中,对于想要访问所有数据而不管用户以及该用户是否登录的应用程序的正确方法是 grant_type=client_credentials,这在 Salesforce 上不存在。

    解决方法如下

    1. 在 GUI 中,编辑您的应用并在“API(启用 OAuth 设置)”中,添加“访问和管理您的数据 (api) 或完全访问并代表您随时执行请求(刷新令牌)”
    2. 在 GUI 中,将回调 url 设置为 https://localhost/oauth(这是一个 hack,我们稍后会利用它来发挥我们的优势)
    3. 现在,转到网址(用您的数据填写参数)https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id=YOURCLIENTID&redirect_uri=https%3A%2F%2Flocalhost%2Foauth
    4. 您的浏览器会将您重定向到https://localhost/oauth?code=YOURCODE 注意:此代码只能使用一次,然后您需要重复第 3 步并再次运行。
    5. 使用第 4 步中的代码(YOURCODE)运行 POST 请求到 url https://login.salesforce.com/services/oauth2/token,并使用 grant_type=authorization_code&code=YOURCODE&client_id=YOURCLIENTID&client_secret=YOURSECRET&redirect_uri=https%3A%2F%2Flocalhost%2Foauth 正文中的数据李>

    注意:YOURCODE 中有一些%3Ds....您不需要修改它们并将它们转换为=,您可以保持原样。

    这会导致返回您可以使用的刷新令牌和您可以使用的当前访问令牌。

    现在,只需将刷新令牌保存到您的数据库中(我希望它几乎可以持续到有人删除应用程序并且时间会告诉我猜)。

    【讨论】:

    • 我在第 5 步遇到错误,而不是刷新和访问令牌。我得到的错误是: string(74) "{"error":"invalid_grant","error_description":"invalid authentication code"}" 我尝试从第 4 步获取新代码,但同样的问题。
    • 您需要将 Unicode 转换为 HTML 实体才能使用代码。你可以使用这个工具:online-toolz.com/tools/unicode-html-entities-convertor.php
    【解决方案2】:

    您可以使用常规的交互式 OAuth 登录流程来获取刷新令牌,该令牌可用于根据需要获取新的访问令牌。详情请见https://wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com

    【讨论】:

    • hmmm,它说它必须使用我没有重定向 url 的重定向 url(因为当我在 salesforce 中单击新应用程序时,我只是在其中放了一个假 url)。我还没有应用程序并且正在测试,该应用程序也不会有一个带有任何重定向 url 的网页。你有我可以运行的 curl 命令吗?
    • 您只能通过交互式登录获取刷新令牌。您的应用需要一个本地重定向 URI。
    • 我的应用程序不是 Web 应用程序,也不是在销售人员可以重定向回它的任何防火墙之外.....所以这意味着我唯一的方法是将用户名/密码存储在应用程序本身中因为我无法获得刷新访问令牌?
    • hmmmm,谷歌有一种方法可以让原生应用程序看起来没有 oatuh2 的重定向 URL。销售人员没有那个? ....groups.google.com/forum/#!topic/google-latitude-api/I-tH5pdbYKY
    • 您可以使用非 http 重定向 URI 从浏览器触发对本机应用的回调。
    猜你喜欢
    • 2012-09-05
    • 2023-03-30
    • 2013-02-06
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多