【问题标题】:HTTP API Authentification in R via 0auth通过 auth0 在 R 中进行 HTTP API 身份验证
【发布时间】:2017-11-15 00:10:37
【问题描述】:

我在通过 0auth 访问跟踪 API 时遇到了一些问题;

我有签名密钥、秘密和授权密钥。

据我所知,签名密钥和秘密应该形成一个 sig 文件,而授权密钥应该作为标题添加。

代码:

auth_info <-
  read.csv2('./Data/auth_info.csv',
            encoding = 'UTF-8',
            stringsAsFactors = F)

express <-
  oauth_app("express", key = 'Ur1475', secret = auth_info$sign_key)

sig <- sign_oauth1.0(express)

order <-
  GET(
    "http://www.express.ru/api/v2/getOrder?orderNumber=WEBN3141018",
    authenticate("Ur1475", auth_info$sign_key),
    add_headers(Authorization = auth_info$auth_key),
    sig
  )

order_info <- content(order)

order_info

返回我的身份验证错误;

官方api文档告诉应该形成md5(client key . URL . GET params . POST params .sign key)。

我还查看了不使用 http 的 0auth 功能代码。 会不会导致问题?

能否请您评论一下如何通过 R 从 API 获取数据?

API 文档(俄语)):https://www.express.ru/docs/APIExpressRu.pdf

【问题讨论】:

    标签: r api


    【解决方案1】:

    主要的 API(Google、Twitter、Facebook)需要一个令牌,您必须从 oauth 身份验证中获取该令牌。根据 API,您必须使用函数 GETPOST。您必须提供以base64 编码的密钥。所以我认为你需要的是:

    首先:验证。

    if(!require("jsonlite")){library("jsonlite")}
    if(!require("httr")){library("httr")}
    
    
    #Create your own appication key
    consumer_key <- "your consumer key" #needed
    consumer_secret <- "your consumer secret" #some api's don't need.
    
    #Use basic auth
    secret <- jsonlite::base64_enc(paste(consumer_key, consumer_secret, sep = ":"))
    req <- httr::POST("https://url.of.your.api/oauth/token", #"oauth" and "token" are not parameters, they are fixed.
                      httr::add_headers(
                        "Authorization" = paste("Basic", gsub("\n", "", secret)),
                        "Content-Type" = "application/x-www-form-urlencoded;charset=UTF-8"
                      ),
                      body = "grant_type=client_credentials"
    )
    
    #Extract the access token
    token <- paste("Bearer", httr::content(req)$access_token)
    

    下一步:提出请求。

    url<-"http://url.of.your.api/search?parameter1=value&parameter2=value"
    
    req <- httr::POST(url, httr::add_headers("Authorization" = token))
    
    json <- httr::content(req)
    json
    

    正如我所说,一些 API 需要 GET 和其他 POST,两者都试试。

    【讨论】:

    • 我确信 API 不提供令牌。这是他们的 PHP SDK github.com/ExpressRu/SDK/blob/master/src/Api/Auth/… 这是什么意思:“Content-Type” = “application/x-www-form-urlencoded;charset=UTF-8”
    • 总而言之,我仍然不知道应该把签名密钥放在哪里
    • "Content-Type" 和编码有关,我说我不确定你的API是否和我的代码一样,但是API的主要工作类似,只是一个通用的代码,因为您共享的文档是俄语:S。尝试使代码适应您的 API,如果您向我提供英文文档,我可能会帮助您。 API 不提供令牌,令牌必须由您提取,执行上述操作。
    • 在您的代码中,您输入了secret = auth_info$sign_key。必须在您之前阅读的 CSV 文件中。
    • 文档实际上告诉我们 sig 应该形成为 md5(username . URL.GET params.POST params .signaturekey);之后我只应该添加 auth_key 作为标题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2014-05-26
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多