【问题标题】:How to generate Pusher authentication string from Bash?如何从 Bash 生成 Pusher 身份验证字符串?
【发布时间】:2015-08-01 01:45:37
【问题描述】:

我无法生成“正确”的身份验证字符串以供何时使用 通过 curl 向 Pusher 发送消息

这是我的脚本,其中的秘密部分当然被删掉了:

#!/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

然后向下滚动到“有效的身份验证示例”,您将能够按照示例进行操作。

我尝试通过运行以下示例生成签名:

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

【问题讨论】:

  • 这可能是也可能不是您的问题的原因,但是您应该双引号所有变量引用以保护它们免受意外的shell扩展(由shell解释); "$data",而不是$data"$secret",而不是$secret,...
  • 试过了,同样的问题...
  • 知道了;请在您的问题中添加双引号,以免分散注意力。
  • 感谢更新,但我的意思是:双引号变量引用除非它们已经在(更大的)双引号字符串中
  • 对不起!没有意识到这个潜在的问题。不过还是坏了……

标签: bash curl pusher


【解决方案1】:

尝试以下方法:

#!/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,您在输入到 md5openssl 的输入中附加了一个尾随换行符,这会改变数据。
  • 要传递给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

【讨论】:

【解决方案2】:

已经有一段时间了,但我最近需要这个,下面的脚本对我有用:

#!/bin/bash

# Replace the following placeholders
PUSHER_AUTH_KEY='<your-auth-key>'
PUSHER_AUTH_SECRET='<your-secret-key>'
PUSHER_URL_PREFIX='https://api-<your-cluster>.pusher.com'
PUSHER_URL_SUFFIX='/apps/<your-app-id>/events'
PUSHER_DATA='{"data":"{\"message\":\"hello world\"}","name":"my-event","channel":"my-channel"}'

# From here on it should be mostly standard
PUSHER_AUTH_VERSION='1.0'
PUSHER_AUTH_TIMESTAMP=$(date +%s)
PUSHER_URL=$PUSHER_URL_PREFIX$PUSHER_URL_SUFFIX
PUSHER_BODY_MD5=$(echo -n $PUSHER_DATA | openssl dgst -md5 -hex)
PUSHER_SIGNATURE="POST\n$PUSHER_URL_SUFFIX\nauth_key=$PUSHER_AUTH_KEY&auth_timestamp=$PUSHER_AUTH_TIMESTAMP&auth_version=$PUSHER_AUTH_VERSION&body_md5=$PUSHER_BODY_MD5"
PUSHER_AUTH_SIGNATURE=$(echo -en $PUSHER_SIGNATURE | openssl dgst -sha256 -hex -hmac $PUSHER_AUTH_SECRET)

curl -i -H 'Content-Type: application/json' -d "$PUSHER_DATA" \
"$PUSHER_URL?"\
"body_md5=$PUSHER_BODY_MD5&"\
"auth_version=$PUSHER_AUTH_VERSION&"\
"auth_key=$PUSHER_AUTH_KEY&"\
"auth_timestamp=$PUSHER_AUTH_TIMESTAMP&"\
"auth_signature=$PUSHER_AUTH_SIGNATURE"

这是非常基本的,使用 Pusher 网站上的示例数据,但可以根据您的用例对其进行改进以接收一些参数作为输入。这里的目标是让您大致了解它的工作原理。

请注意必须安装openssl 才能工作。

希望这将在未来对其他人有用。

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2012-12-31
    • 1970-01-01
    • 2018-01-21
    • 2015-08-27
    • 1970-01-01
    • 2010-09-07
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多