如何正确使用 httr 进行 X-WSSE 认证?
How to use httr correctly for X-WSSE Authentification?
我正在尝试连接到 API of emarsys。他们使用 X-WSSE 作为身份验证方法,我卡住了,需要弄清楚我做错了什么。我试着按要求制作 header,但我不知道哪里出错了。非常感谢您的评论!
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-code 请求的外观以及我所做的不同之处。
编辑:
"digest::sha1(pwd, algo="sha1", serialize=FALSE)"
必须是 digest(pwd, algo="sha1", serialize=FALSE)
。然后就可以了。
这是一种评论,但为了清晰起见,我无法按照需要的方式进行格式化,所以在这里。如果如此感动,学究们可以随意对此投反对票:
首先,向 GET()
调用添加一个 verbose()
参数,以查看您传递的内容是否符合您的预期。我敢打赌问题出在您分配的 'X-WSSEP:'
值中的 :
。我还发现在 add_headers()
调用中使用命名参数要容易得多,所以也许可以尝试:
GET(
url = URL,
add_headers(`X-WSSE` = header),
verbose()
)
看看是否解决了这个问题,或者至少让你更进一步。
此外:一旦您的问题得到解决并获得所需的访问权限,请考虑为 Emarsys API 制作一个 pkg。如果您之前没有制作过软件包,那将是一次 ++gd 的学习经历,并且无论哪种方式,它都可能对其他人有所帮助。
我正在尝试连接到 API of emarsys。他们使用 X-WSSE 作为身份验证方法,我卡住了,需要弄清楚我做错了什么。我试着按要求制作 header,但我不知道哪里出错了。非常感谢您的评论!
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-code 请求的外观以及我所做的不同之处。
编辑:
"digest::sha1(pwd, algo="sha1", serialize=FALSE)"
必须是 digest(pwd, algo="sha1", serialize=FALSE)
。然后就可以了。
这是一种评论,但为了清晰起见,我无法按照需要的方式进行格式化,所以在这里。如果如此感动,学究们可以随意对此投反对票:
首先,向 GET()
调用添加一个 verbose()
参数,以查看您传递的内容是否符合您的预期。我敢打赌问题出在您分配的 'X-WSSEP:'
值中的 :
。我还发现在 add_headers()
调用中使用命名参数要容易得多,所以也许可以尝试:
GET(
url = URL,
add_headers(`X-WSSE` = header),
verbose()
)
看看是否解决了这个问题,或者至少让你更进一步。
此外:一旦您的问题得到解决并获得所需的访问权限,请考虑为 Emarsys API 制作一个 pkg。如果您之前没有制作过软件包,那将是一次 ++gd 的学习经历,并且无论哪种方式,它都可能对其他人有所帮助。