作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在生成“正确的”身份验证字符串时遇到问题通过 curl 向 Pusher 发送消息
这是我的脚本,其中的 secret 部分当然被删除了:
#!/bin/bash
key="my_key"
secret="my_secret"
appID="my_app_id"
timestamp=`date +%s`
data='{"name":"say_stuff","channel":"test","data":"{\"message\":\"oh_yeah\"}"}'
md5data=`echo "$data" | md5`
authSig=`echo 'POST\n/apps/"$appID"/events\nauth_key="$key"&auth_timestamp="$timestamp"&auth_version=1.0&body_md5="$md5data"' | openssl dgst -sha256 -hex -hmac "$secret"`
curl -H "Content-Type:application/json" -d "$data" "http://api.pusherapp.com/apps/$appID/events?body_md5=$md5data&auth_version=1.0&auth_key=$key&auth_timestamp=$timestamp&auth_signature=$authSig"
authSig 确实生成了,看起来像有效的 HmacSHA256Hex
但是,当它运行 curl 命令时,我得到这样的响应:
Invalid signature: you should have sent HmacSHA256Hex("POST\n/apps/$appID/events\nauth_key=$key&auth_timestamp=1432086733&auth_version=1.0&body_md5=e5997a811232ffae050be74242254ceb", your_secret_key), but you sent "55029a5e2d1058b352b5c22709e7fb9cb0c6f147846ed09dbc6bcaf6a7a804c7"
我的机器 (Mac OS X 10.10) 上的 openssl 实用程序是否可能与 Pusher 的有所不同?
这是我现在注意到的一些有趣的事情。如果你去这里:
https://pusher.com/docs/rest_api
然后向下滚动到“Worked authentication example”,您将能够跟随一个示例。
我尝试通过运行以下示例生成签名:
echo 'POST\n/apps/3/events\nauth_key=278d425bdf160c739803&auth_timestamp=1353088179&auth_version=1.0&body_md5=ec365a775a4cd0599faeb73354201b6f' | openssl dgst -sha256 -hex -hmac 7ad3773142a6692b25b8
我明白了
aa368756587116f3997427fe1b315ed0e2f2faa555066e565a25cfe6f47c9396
与他们的例子相反
da454824c97ba181a32ccc17a72625ba02771f50b50e1e7430e47a1f3f457e6c
最佳答案
尝试以下操作:
#!/bin/bash
key="my_key"
secret="my_secret"
appID="my_app_id"
timestamp=$(date +%s)
data='{"name":"say_stuff","channel":"test","data":"{\"message\":\"oh_yeah\"}"}'
# Be sure to use `printf %s` to prevent a trailing \n from being added to the data.
md5data=$(printf '%s' "$data" | md5)
path="/apps/${appID}/events"
queryString="auth_key=${key}&auth_timestamp=${timestamp}&auth_version=1.0&body_md5=${md5data}"
# Be sure to use a multi-line, double quoted string that doesn't end in \n as
# input for the SHA-256 HMAC.
authSig=$(printf '%s' "POST
$path
$queryString" | openssl dgst -sha256 -hex -hmac "$secret")
curl -H "Content-Type:application/json" -d "$data" "http://api.pusherapp.com${path}?${queryString}&auth_signature=${authSig}"
你的代码有几个问题:
echo
,您将一个尾随换行符附加到馈送到 md5
和 openssl
的输入中,这改变了数据。openssl
的字符串中的 \n
序列旨在表示实际 换行符,而您将它们用作 文字。此外,我删除了重复的代码,使用了 ${name}
变量引用(用大括号括起来的名称)以获得更好的视觉清晰度,我还解决了双引号问题。
关于来自网站的示例哈希:同样,您的问题是使用 echo
而不是将嵌入的 \n
序列扩展为实际的换行符;以下 shell 命令确实给出了正确的结果:
# Expand the '\n' sequences to newlines using an ANSI C-quoted string
# ($'...')
s=$'POST\n/apps/3/events\nauth_key=278d425bdf160c739803&auth_timestamp=1353088179&auth_version=1.0&body_md5=ec365a775a4cd0599faeb73354201b6f'
# Pass to openssl using `printf %s`.
printf %s "$s" | openssl dgst -sha256 -hex -hmac 7ad3773142a6692b25b8
关于bash - 如何从 Bash 生成 Pusher 身份验证字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30339045/
我是一名优秀的程序员,十分优秀!