如何正确使用httr进行X-WSSE身份验证?

时间:2017-11-02 13:45:52

标签: r api httr wsse

我正在尝试连接到API of emarsys。他们使用X-WSSE作为身份验证方法,我陷入困境,需要弄清楚我做错了什么。我试图按照要求制作标题,但我不知道它出错了。我非常感谢你的评论!

install.packages("httr")
install.packages("digest")
library("httr") 
library("digest")

# prepare userdata
username     <- "customer001"
secretkey    <- "supersecretkey"
timestamp    <- format(as.POSIXlt(Sys.time(), "UTC"), "%Y-%m-%dT%H:%M:%SZ")
nonce        <- digest(random(8), length=16)

# passworddigest
pwd       <- paste0(nonce, timestamp, secretkey) 
pwd       <- digest::sha1(pwd, algo="sha1", serialize=FALSE)  
pwd       <- jsonlite::base64_enc(charToRaw(pwd)) 

URL_base     <- "https://api.emarsys.net/api/v2/"
URL_endpoint <- "contact/settings"
URL          <- paste0(URL_base,URL_endpoint)

# create header 
header <- c(paste0('UsernameToken ',
                   'Username="', username, '", ',
                   'PasswordDigest="', pwd,'", ',
                   'Nonce="', nonce, '", ',
                   'Created="', timestamp,'"'))
# name header
names(header) <- 'X-WSSE:'    

# make httr request   
response <- GET(URL, add_headers(.headers = header))
response

http-header应如下所示:

  

X-WSSE:UsernameToken Username =“customer001”,   PasswordDigest = “ZmI2ZmQ0MDIxYmQwNjcxNDkxY2RjNDNiMWExNjFkZA ==”,   Nonce =“d36e3162829ed4c89851497a717f”,Created =“2014-03-20T12:51:45Z”

但我不知道我在哪里可以找到,我的httr代码的请求看起来如何以及我做了什么不同。 编辑: "digest::sha1(pwd, algo="sha1", serialize=FALSE)"必须为digest(pwd, algo="sha1", serialize=FALSE)。然后就行了。

1 个答案:

答案 0 :(得分:1)

这是一种评论,但我不能格式化它需要在那里清晰的方式,所以在这里。如果这样的话,那么小学生可以随心所欲地投票:

首先,在verbose()调用中添加GET()参数,以查看您传递的内容是否符合您的预期。我打赌问题是你要分配的:值中的'X-WSSEP:'。我还发现在add_headers()调用中使用命名参数要容易得多,所以也许可以尝试:

GET(
  url = URL,
  add_headers(`X-WSSE` = header),
  verbose()
)

看看是否清除了这一点,或者至少让你更进一步。

此外:一旦您的问题得到解决并且您获得了所需的访问权限,请考虑为Emarsys API创建一个pkg。如果你之前没有制作过包,那么它可以成为一种++ gd的学习经验,无论哪种方式都可以帮助他人。