使用 Azure 应用服务和 Intel Edison 的 GET 请求

GET request using Azure app services and Intel Edison

我想使用 REST API 从 azure 应用程序服务的简单表中读取数据到 Intel Edison。在我使用 Azure 移动服务做同样的事情之前,我的代码是这样的。 PS:我正在使用 Arduino IDE 对设备进行编程。

void send_request()  
{  
  Serial.println("\nconnecting...");  
  if (client.connect(server, 80)) {   

  // POST URI  
 sprintf(buffer, "GET /tables/%s HTTP/1.1", table_name);  
 client.println(buffer);  

 // Host header  
 sprintf(buffer, "Host: %s", server);  
 client.println(buffer);  

 // Azure Mobile Services application key  
 sprintf(buffer, "X-ZUMO-APPLICATION: %s", ams_key);  
 client.println(buffer);  

 // JSON content type  
 client.println("Content-Type: application/json");  

client.print("Content-Length: ");  
client.println(strlen(buffer));  

// End of headers  
client.println();  

// Request body  
client.println(buffer);  

} 
else {  
Serial.println("connection failed");  
}  
}   

其中服务器名称是 "genesis-iot-control.azure-mobile.net";

但现在身份验证已更改,移动服务已被应用服务取代。我如何在 Intel Edison 上使用 REST API 访问它们?

我遵循了这个但没有解决方案。

感谢任何形式的帮助。

应用程序密钥机制已从移动应用程序中删除。 您需要 implement-your-own-header 检查。

更多内容请看这篇文章:
https://github.com/Azure/azure-mobile-apps-net-server/wiki/Implementing-Application-Key

本质上,您从 Edison 发送一个 X-YOUR-CUSTOM-HEADER: SeCreT= 并根据 Node/C# 移动应用程序后端代码中的应用程序设置(在门户中定义)检查其值。

是的,他们应该保留旧机制,默认情况下将其禁用,但允许我们通过应用程序设置将其重新打开。

另一种方法是从 Azure AD 获取 Bearer token 并将其与 Authorization: Bearer ToKen= 一起使用(但无论如何它最终都会过期,除非你也注意刷新它),或构建另一个 Web 应用程序(或当前应用程序中的 API 端点),您将秘密发送到该应用程序,然后发送到 Azure AD 并向您提供 Bearer 令牌。

或者,如果您真的想度过一个非常有趣的下午,请跳 Edison 的 OAuth 舞蹈!
curl 样本在这里: https://ahmetalpbalkan.com/blog/azure-rest-api-with-oauth2/

对于微型 2KB 内存设备(如 Arduino Uno),在内存中存储 Bearer token 和 refresh token 已经是游戏结束了。

我很想知道是否有人有 better/more efficient/more 安全的方法来使用移动应用程序从微控制器进行身份验证。

示例 - 使用 X-SECRET 作为您的自定义身份验证 header:

// Todoitem.js

var azureMobileApps = require('azure-mobile-apps');

// Create a new table definition
var table = azureMobileApps.table();

// Execute only if x-secret header matches our secret
table.read(function (context) {
  // All header names are in lowercase in context.req.headers
  console.info('Got x-secret header with value: ' +
                context.req.headers['x-secret']);
  if (context.req.headers['x-secret'] == process.env.SECRET) {
    console.info('Secret matches value in App Settings.');
    return context.execute();
  }
});

// Removed CREATE, UPDATE, DELETE definitions for brevity.
// YOU NEED TO PROTECT THOSE METHODS AS WELL!

// Finally, export the table to the Azure Mobile Apps SDK - it can be
// read using the azureMobileApps.tables.import(path) method
module.exports = table;

curl 中看到的行为(不用说你应该使用 HTTPS 如果你的 Edison 可以做到这一点):

$ curl -s  -i http://{mobileapp}.azurewebsites.net/tables/todoitem \
           -H "ZUMO-API-VERSION: 2.0.0"

HTTP/1.1 404 Not Found
...
X-Powered-By: Express

{"error":"The item does not exist"}




$ curl -s  -i http://{mobileapp}.azurewebsites.net/tables/todoitem \
           -H "ZUMO-API-VERSION: 2.0.0" \
           -H "X-SECRET: SeCr3T="

HTTP/1.1 200 OK
...
X-Powered-By: Express

[
  { 
     "id": "40b996d6-ec7f-4188-a310-0f02808e7093",
     "createdAt": "2016-08-31T11:30:11.955Z",
     ...
     "Yo_node":"Sup"
  }
]

使用应用服务编辑器(摩纳哥/Visual Studio在线编辑器)编码和检查输出 - https://{mobileapp}。scm.azurewebsites.net/dev