【发布时间】:2017-02-04 15:04:52
【问题描述】:
我正在开发 azure 函数来调用 Azure SQL 数据仓库的其余 API 以在一天中的特定时间暂停和恢复服务器(2 个函数)。在我之前创建的 azure 函数中,我不必调用 REST API,因为我只使用了可用的输出选项。而 SQL DW 只有 REST API 选项。
我使用 nodejs 创建了一个函数应用程序,并从那里调用这些 REST API。我浏览了azure REST API documentation 并尝试了那里解释的过程。 首先,我将函数应用程序作为租户添加到 azure 活动目录中,并获取了租户 ID(它是端点 URL 的一部分)和应用程序 ID/客户端 ID,然后尝试调用此处提到的登录 URL https://docs.microsoft.com/en-us/azure/active-directory/active-directory-protocols-oauth-code#request-an-authorization-code 通过传递所需的参数。虽然它被提到为 GET,但我尝试了 GET 和 POST,但它们没有工作。
module.exports = function(context) {
var unirest = require('unirest');
var subscriptionId='subscriptionId';
context.log("starting the function");
unirest.post('https://login.windows.net/tenantID/oauth2/authorize')
.headers({'Accept': 'application/json', 'Content-Type': 'application/json'})
.send({ "client_id": "clientID ", "response_type": "code","grant_type":"authorization_code" })
.end(function (response) {
context.log(response.body);
});
});
这段代码只是为了获取授权码,然后会有另外一种方法来获取令牌,然后调用实际的 SQL DW 暂停/恢复方法。 当我从 VS2015 运行相同的(删除模块导出并将上下文更改为控制台)时,我得到与以下相同的错误
<html><head><title>Continue</title></head><body><form method="POST" name="hiddenform" action="https://login.microsoftonline.com/9b8d9cda-ddb4-43bb-8725-bc0e9af83b43/oauth2/authorize"><noscript><p>Script is disabled. Click Submit to continue</p><input type="submit" value="Submit" /></noscript></form><script language="javascript">window.setTimeout('document.forms[0].submit()', 0);</script></body></html>
我不确定我在这里缺少什么。如果有人以前做过,请分享您的 cmets/ 解决方案。
更新:添加 Azure AD - 注册权限页面作为对其中一个 cmets 的回复。让我知道这是否符合要求。
我发现了与权限有关的问题。我必须向 AAD 中的应用程序提供 SQL 数据库服务器管理器 RBAC 角色。 Resume commandlet 工作正常,但 Suspend commandlet 不起作用。发生以下异常。
Suspend-AzureRmSqlDatabase:40640:服务器遇到意外异常。 在行:9 字符:35 + $结果数据库 = $数据库 |挂起-AzureRmSqlDatabase; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [Suspend-AzureRmSqlDatabase], CloudException + FullyQualifiedErrorId : Microsoft.Azure.Commands.Sql.DatabaseActivation.Cmdlet.SuspendAzureSqlDatabase
【问题讨论】:
-
如果帖子不是发给login.microsoftonline.com 而不是 login.windows.net 以获得第一个 access_token。我在文档中看到 login.windows.net 仅在您拥有访问身份验证资源的令牌时才建议使用
-
是的..我的错..感谢您发现这一点。让我换一下试试看。
标签: node.js rest active-directory azure-functions azure-sqldw