如何以非交互方式从 node.js 服务器端使用 azure AD 身份验证
How to use azure AD authentication from node.js server side non interactively
我已经配置了 azure AD 服务和其中的一个用户,并使用 react-adal 来获取令牌,这有效 fine.But 现在我需要更改此流程,而是拥有自己的登录表单并发送node.js express 服务器的凭据并从 azure ad 验证这些凭据,而不会从 azure 弹出登录窗口并将返回的令牌存储在护照中 session.I 已尝试使用 node-adal 但不确定如何实现,可以这能完成吗?有没有 this.Thanks
的例子
有一个方法,但你不应该使用它。
使用联合身份验证时,您不应处理密码。
一种可行的方法是遗留迁移路径,称为 ROPC 流。
但是,其中 none 个将起作用:
- 拥有 MFA 的用户
- 从本地 AD 同步的用户
- 密码已过期的用户
如果您想以用户身份在后台执行某些操作,请让他们登录并安全地存储他们的刷新令牌。
您需要将前端访问令牌交换为后端访问令牌 + 刷新令牌。
然后您可以随时使用刷新令牌为用户获取新令牌。
或者,您可以要求应用程序获得 API 的权限,并使用来自您的 API 的客户端凭据访问它们(客户端 ID + secret/certificate)。
同意@juunas的观点,这里提供非交互方式(login with username and password)供大家参考。此示例用于管理 MicrosoftGraph 资源。
var msRestAzure = require('ms-rest-azure');
var graphRbacManagementClient = require('azure-graph');
var tenantId='abcd-efgh-ijk-lmno-12345';
// Enter your tenant ID here which can be found from your Azure AD URL
// Eg. https://manage.windowsazure.com/example.com#Workspaces/ActiveDirectoryExtension/Directory/<TenantId>/users
msRestAzure.loginWithUsernamePassword('username@contosocorp.onmicrosoft.com', 'your-password', { tokenAudience: 'graph', domain: tenantId }, function (err, credentials, subscriptions) {
if (err) console.log(err);
var client = new graphRbacManagementClient(credentials, tenantId);
var userParams = {
accountEnabled: true,
userPrincipalName: 'OfficialStark@<yourdomain.com>', //please add your domain over here
displayName: 'Jon Snow',
mailNickname: 'OfficialStark',
passwordProfile: {
password: 'WinterisComing!',
forceChangePasswordNextLogin: false
}
};
client.users.create(userParams, function (err, user, request, response) {
if (err) return console.log(err);
console.log(user);
var userObjectId = user.objectId;
client.users.list(function (err, result, request, response) {
if (err) return console.log(err);
console.log(result);
client.users.deleteMethod(userObjectId, function (err, result, request, response) {
if (err) return console.log(err);
console.log(result);
});
});
});
});
我已经配置了 azure AD 服务和其中的一个用户,并使用 react-adal 来获取令牌,这有效 fine.But 现在我需要更改此流程,而是拥有自己的登录表单并发送node.js express 服务器的凭据并从 azure ad 验证这些凭据,而不会从 azure 弹出登录窗口并将返回的令牌存储在护照中 session.I 已尝试使用 node-adal 但不确定如何实现,可以这能完成吗?有没有 this.Thanks
的例子有一个方法,但你不应该使用它。 使用联合身份验证时,您不应处理密码。
一种可行的方法是遗留迁移路径,称为 ROPC 流。 但是,其中 none 个将起作用:
- 拥有 MFA 的用户
- 从本地 AD 同步的用户
- 密码已过期的用户
如果您想以用户身份在后台执行某些操作,请让他们登录并安全地存储他们的刷新令牌。 您需要将前端访问令牌交换为后端访问令牌 + 刷新令牌。 然后您可以随时使用刷新令牌为用户获取新令牌。
或者,您可以要求应用程序获得 API 的权限,并使用来自您的 API 的客户端凭据访问它们(客户端 ID + secret/certificate)。
同意@juunas的观点,这里提供非交互方式(login with username and password)供大家参考。此示例用于管理 MicrosoftGraph 资源。
var msRestAzure = require('ms-rest-azure');
var graphRbacManagementClient = require('azure-graph');
var tenantId='abcd-efgh-ijk-lmno-12345';
// Enter your tenant ID here which can be found from your Azure AD URL
// Eg. https://manage.windowsazure.com/example.com#Workspaces/ActiveDirectoryExtension/Directory/<TenantId>/users
msRestAzure.loginWithUsernamePassword('username@contosocorp.onmicrosoft.com', 'your-password', { tokenAudience: 'graph', domain: tenantId }, function (err, credentials, subscriptions) {
if (err) console.log(err);
var client = new graphRbacManagementClient(credentials, tenantId);
var userParams = {
accountEnabled: true,
userPrincipalName: 'OfficialStark@<yourdomain.com>', //please add your domain over here
displayName: 'Jon Snow',
mailNickname: 'OfficialStark',
passwordProfile: {
password: 'WinterisComing!',
forceChangePasswordNextLogin: false
}
};
client.users.create(userParams, function (err, user, request, response) {
if (err) return console.log(err);
console.log(user);
var userObjectId = user.objectId;
client.users.list(function (err, result, request, response) {
if (err) return console.log(err);
console.log(result);
client.users.deleteMethod(userObjectId, function (err, result, request, response) {
if (err) return console.log(err);
console.log(result);
});
});
});
});