【问题标题】:I don't know how to set the access_token我不知道如何设置 access_token
【发布时间】:2021-06-30 07:08:18
【问题描述】:

目前我正在使用 Salesforce 的 rest api,以便我可以在 Salesforce 中创建和更新对象。

通过使用 curl 命令,我可以发现我可以按照自己的意愿在 salesforce 中创建和更新对象。

现在我想创建一个方法,它可以像使用 curl 命令一样做。但是当我阅读下面的错误时,似乎我需要做一些事情才能获得授权。

#<Net::HTTPUnauthorized:0x000055a3702171e0>%  

我想做的是这样的。

1,我想在 salesforce 中创建对象。

2、更新我需要Account对象的对象。

3,所以我想创建一个从 salesforce 中提取所有 Account 对象的方法。

4、在一个方法中我需要用access_token发送Http请求。

5,但我不知道如何设置access_token。

这是我尝试进行身份验证和获取帐户对象的 curl 命令

OAuth

curl -v https://test.salesforce.com/services/oauth2/token \
  -d "grant_type=password" \
  -d "client_id=3MasubgboasbboUIUBOBOUBOUBOJBUTFHBLKJHIU1rMmmDExvMtiR" \
  -d "client_secret=D33ASDFAS82C0EASDFAS48E8F1C21ASFASW6EF21C4D7AASDF4EB5EF3" \
  -d "username=MYNAME@COMPANY.co.jp.instance" -d "password=yatta-"
get Account curl "https://instance.my.salesforce.com//services/data/v52.0/sobjects/Account" -H "Authorization: Bearer 00D1s0023202345234pwb!AQQasdgas3eOlKbprFFRMT_SLFp.Pwt5Q07AI0uHasdgasdxmasdgas2nLiaZ.baVoLZvVVaQK"

获取帐号

curl "https://instance.my.salesforce.com//services/data/v52.0/sobjects/Account" -H "Authorization: Bearer 00D1s0023202345234pwb\!AQQasdgas3eOlKbprFFRMT_SLFp.Pwt5Q07AI0uHasdgasdxmasdgas2nLiaZ.baVoLZvVVaQK"

我尝试的代码是这样的。

  def get_salesforce_company_list
    # hit api and get company list
    access_token = auth
    uri = URI.parse("https://instance.my.salesforce.com//services/data/v52.0/sobjects/Account")
    request = Net::HTTP::Get.new(uri)
    request["Authorization"] = "Bearer" + access_token

    req_options = {
      use_ssl: uri.scheme == "https",
    }
    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end
    print response
  end

  def auth
    uri = URI.parse("https://test.salesforce.com/services/oauth2/token")
    request = Net::HTTP::Post.new(uri)
    request.set_form_data(
      "client_id" => "jnas;jdbojasn;djlnfalsjbdbkjbljasdasknl",
      "client_secret" => "asjbdabHVIVHBJNFLNLKNJDNSjbljsg",
      "grant_type" => "password",
      "password" => "yatta-",
      "username" => "Myname@COMPANY.co.jp.INSTANCE",
    )

    req_options = {
      use_ssl: uri.scheme == "https",
    }

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end
    auth_info = JSON.parse(response.body)
    auth_info["access_token"]
  end

如果有人知道如何发送 http 请求或任何想法如何解决这个问题,我将不胜感激。

编辑

在上面的代码中,“auth”方法工作正常,我可以正确获取 access_token。问题是我无法将其设置为“get_salesforce_company_list”方法并将其用作不记名令牌。

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby salesforce httprequest rest


    【解决方案1】:

    您必须手动处理 http 请求吗?也许像https://github.com/restforce/restforce 这样的现成的东西会更简单?

    无论如何。您使用 https://test.salesforce.com/services/oauth2/token 的 curl 示例看起来像是在使用 "Username Password flow"

    调用成功后,您将返回一个类似这样的 JSON

    {"id":"https://test.salesforce.com/id/00Dx0000000BV7z/005x00000012Q9P",
    "issued_at":"1278448832702",
    "instance_url":"https://yourInstance.salesforce.com/",
    "signature":"0CmxinZir53Yex7nE0TD+zMpvIWYGb/bdJh6XfOH6EQ=",
    "access_token":"00Dx0000000BV7z!AR8AQAxo9UfVkh8AlV0Gomt9Czx9LjHnSSpwBMmbRcgKFmxOtvxjTrKW19ye6PE3Ds1eQz3z8jr3W7_VbWmEu4Q8TVGSTHxs",
    "token_type":"Bearer"}
    

    从这里提取instance_urlaccess_token。您接下来的所有 API 调用都应该从该实例开始(不要硬编码沙箱的 url)并包含 HTTP Header Authorization Bearer {access_token_here}

    【讨论】:

    • 非常感谢您的评论。看来你是对的。我稍后会检查宝石。在我的代码中,“auth”方法工作正常,它返回您提到的 JSON,我想“get_salesforce_company_list”方法,我想将它作为授权承载 {} 传递。我不知道怎么做。不过我会尝试一下。
    • 我更新了我的代码,请检查一下。现在,我正在使用restforce版本
    • 对不起,我的红宝石知识不存在。 stackoverflow.com/questions/44839503/… ?
    【解决方案2】:

    我很抱歉我犯了愚蠢的错误,但解决方案类似于下面的解决方案。

    我需要在“Bearer”后面加空格

    request["Authorization"] = "Bearer" + access_token

    谢谢大家的回答,对我的错误深表歉意。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多