HTTP POST Azure 中的授权 header [错误代码 401]
Authorization header in HTTP POST Azure [Error code 401]
我关注 this link 是为了向 Azure 中的 Eventhub 发送 HTTP POST。我得到的错误是 401 40103:无效的授权令牌签名。根据 Azure,POST 应具有以下格式:
POST https://your-namespace.servicebus.windows.net/your-event-hub/partitions/0/messages?timeout=60&api-version=2014-01 HTTP/1.1
Authorization: SharedAccessSignature sr=your-namespace.servicebus.windows.net&sig=your-sas-key&se=1403736877&skn=RootManageSharedAccessKey
Content-Type: application/atom+xml;type=entry;charset=utf-8
Host: your-namespace.servicebus.windows.net
关于授权header,我有几个问题:
- 我的密钥 (sig) 有一个等号,我应该用它代替吗
%3d?
- 我目前也在做 POST 操作
Python 中的示例脚本和来自 Azure 的 C。在这些例子中,是
只需要引入具有所有凭据的端点和
post/get 操作正常。是否可以执行
put/get 操作直接在 api 中引入端点
休息一下,或者获取下面执行的授权header
python 或 C 代码?
谢谢。
我可以通过在 命名空间 而不是事件中心创建 SAS 策略(下面的 nssend
)来使其工作。
$ curl -X POST -i "https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages" \
-H "Authorization: SharedAccessSignature sr=https%3A%2F%2Fbreakingnews.servicebus.windows.net%2Fsucheventsmuchwow%2Fmessages&sig=SAS_SIG_GOES_HERE&se=1536733370&skn=nssend" \
-H "Content-Type: application/json" \
--data-ascii "{ \"message\": \"So many events, so little time.\" }"
HTTP/1.1 201 Created
Server: Microsoft-HTTPAPI/2.0
...
这样就可以了。
但是,当使用事件中心级别的 SAS 策略(而不是名称空间级别的策略)生成签名时,我得到了一个 HTTP 401
,就像你一样。
这是我用来生成 SAS 令牌的东西 —
// Make a SAS token
// See https://docs.microsoft.com/en-us/rest/api/eventhub/generate-sas-token
// Appologies for JavaScript
// npm install moment
const moment = require('moment');
const crypto = require('crypto');
function create_sas_token(uri, key_name, key)
{
// Token expires in one hour
var expiry = moment().add(7, 'days').unix();
var string_to_sign = encodeURIComponent(uri) + '\n' + expiry;
var hmac = crypto.createHmac('sha256', key);
hmac.update(string_to_sign);
var signature = hmac.digest('base64');
var token = 'SharedAccessSignature sr=' +
encodeURIComponent(uri) +
'&sig=' + encodeURIComponent(signature) +
'&se=' + expiry + '&skn=' + key_name;
return token;
}
let token = create_sas_token('https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages', 'MySendPolicy', 'MySendPolicyPrimaryKey=');
console.log(token);
更新
感谢 Clemens Vasters —
Try omitting "/messages"
— Clemens Vasters , Messenger (@clemensv) September 5, 2018
您要签名的字符串(资源 URI)应省略 /messages
,例如
create_sas_token('https://breakingnews.servicebus.windows.net/sucheventsmuchwow',
'MyEventHubLevelPolicy', 'hUbPriMAry/KEy=');
然后按如下方式编写您的请求 —
$ curl -X POST -i "https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages" \
-H "Authorization: SharedAccessSignature sr=https%3A%2F%2Fbreakingnews.servicebus.windows.net%2Fsucheventsmuchwow&sig=DONT_INCLUDE_/MESSAGES_IN_STRING_TO_SIGN&se=1536757127&skn=MyEventHubLevelPolicy" \
-H "Content-Type: application/json" \
--data-ascii "{ \"message\": \"SAS signed with Event Hub level policy\" }"
HTTP/1.1 201 Created
Server: Microsoft-HTTPAPI/2.0
...
长话短说:
您的 POST URL 应该包括结尾的 /messages
,但要签名的字符串(资源 URI)不应该。总是。无论是使用命名空间还是 Hub 范围的策略。
我关注 this link 是为了向 Azure 中的 Eventhub 发送 HTTP POST。我得到的错误是 401 40103:无效的授权令牌签名。根据 Azure,POST 应具有以下格式:
POST https://your-namespace.servicebus.windows.net/your-event-hub/partitions/0/messages?timeout=60&api-version=2014-01 HTTP/1.1 Authorization: SharedAccessSignature sr=your-namespace.servicebus.windows.net&sig=your-sas-key&se=1403736877&skn=RootManageSharedAccessKey Content-Type: application/atom+xml;type=entry;charset=utf-8 Host: your-namespace.servicebus.windows.net
关于授权header,我有几个问题:
- 我的密钥 (sig) 有一个等号,我应该用它代替吗 %3d?
- 我目前也在做 POST 操作 Python 中的示例脚本和来自 Azure 的 C。在这些例子中,是 只需要引入具有所有凭据的端点和 post/get 操作正常。是否可以执行 put/get 操作直接在 api 中引入端点 休息一下,或者获取下面执行的授权header python 或 C 代码?
谢谢。
我可以通过在 命名空间 而不是事件中心创建 SAS 策略(下面的 nssend
)来使其工作。
$ curl -X POST -i "https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages" \
-H "Authorization: SharedAccessSignature sr=https%3A%2F%2Fbreakingnews.servicebus.windows.net%2Fsucheventsmuchwow%2Fmessages&sig=SAS_SIG_GOES_HERE&se=1536733370&skn=nssend" \
-H "Content-Type: application/json" \
--data-ascii "{ \"message\": \"So many events, so little time.\" }"
HTTP/1.1 201 Created
Server: Microsoft-HTTPAPI/2.0
...
这样就可以了。
但是,当使用事件中心级别的 SAS 策略(而不是名称空间级别的策略)生成签名时,我得到了一个 HTTP 401
,就像你一样。
这是我用来生成 SAS 令牌的东西 —
// Make a SAS token
// See https://docs.microsoft.com/en-us/rest/api/eventhub/generate-sas-token
// Appologies for JavaScript
// npm install moment
const moment = require('moment');
const crypto = require('crypto');
function create_sas_token(uri, key_name, key)
{
// Token expires in one hour
var expiry = moment().add(7, 'days').unix();
var string_to_sign = encodeURIComponent(uri) + '\n' + expiry;
var hmac = crypto.createHmac('sha256', key);
hmac.update(string_to_sign);
var signature = hmac.digest('base64');
var token = 'SharedAccessSignature sr=' +
encodeURIComponent(uri) +
'&sig=' + encodeURIComponent(signature) +
'&se=' + expiry + '&skn=' + key_name;
return token;
}
let token = create_sas_token('https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages', 'MySendPolicy', 'MySendPolicyPrimaryKey=');
console.log(token);
更新
感谢 Clemens Vasters —
Try omitting "/messages"
— Clemens Vasters , Messenger (@clemensv) September 5, 2018
您要签名的字符串(资源 URI)应省略 /messages
,例如
create_sas_token('https://breakingnews.servicebus.windows.net/sucheventsmuchwow',
'MyEventHubLevelPolicy', 'hUbPriMAry/KEy=');
然后按如下方式编写您的请求 —
$ curl -X POST -i "https://breakingnews.servicebus.windows.net/sucheventsmuchwow/messages" \
-H "Authorization: SharedAccessSignature sr=https%3A%2F%2Fbreakingnews.servicebus.windows.net%2Fsucheventsmuchwow&sig=DONT_INCLUDE_/MESSAGES_IN_STRING_TO_SIGN&se=1536757127&skn=MyEventHubLevelPolicy" \
-H "Content-Type: application/json" \
--data-ascii "{ \"message\": \"SAS signed with Event Hub level policy\" }"
HTTP/1.1 201 Created
Server: Microsoft-HTTPAPI/2.0
...
长话短说:
您的 POST URL 应该包括结尾的 /messages
,但要签名的字符串(资源 URI)不应该。总是。无论是使用命名空间还是 Hub 范围的策略。