node.js - MSAL Node 服务和合作伙伴中心 API

标签 node.js azure oauth-2.0 azure-active-directory azure-ad-msal

tl;博士

非交互式服务中使用 msal-node,我如何授权为启用 MFA 的用户一次并且从不(或很少)必须再次授权为该用户?特别是在向合作伙伴中心 API 发出请求时。

更长的版本

我一直在尝试在 NodeJS 中创建一个与 Microsoft 合作伙伴中心 API 交互的后端服务(即守护进程)。但是,如果没有持续的用户交互,我找不到官方支持的方法来执行此操作。

基于most documentation我可以发现,没有任何用户交互的服务意味着使用“客户端凭据”流程。这对于其他 Azure API 非常有用,但在合作伙伴中心 API 中似乎不起作用,尽管 the docs说。

什么有效,以及我被迫做的,是以用户身份登录。但是,由于所有用户都启用了 MFA,因此我必须遵循概述的方法 in these docs我以用户身份手动登录并一次性交换刷新 token 。然后,我将其保存到文件中,然后守护程序可以不断地将其交换为访问 token 以及更新的刷新 token 。

msal-node 看起来并不支持仅使用开箱即用的刷新 token 。唯一接受一个参数作为参数的实例方法是 .acquireTokenByRefreshToken() ,它确实返回一个访问 token (请参阅 this sample ),但更新实例的内部缓存或返回一个新的刷新 token ,因此现有的刷新 token 将提前过期。它似乎也已被弃用,取而代之的是 .acquireTokenSilent(),但该方法要求实例的内部缓存已填充身份验证数据。但是,我没有看到任何公共(public)方法来手动设置内部缓存的数据,并且只有在调用诸如 .acquireTokenByCode() 之类的方法后才会自动设置,这些方法接受用户登录后生成的短期 token 。同样,由于所有用户都启用了 MFA,因此每次服务重新启动时都需要用户交互。

这有点像先有鸡还是先有蛋的问题。感谢任何帮助,我一直在阅读这么多 MS 文档和代码。

最佳答案

this official doc表示:

The refresh token is never returned to the user in a response

因此,按照设计,您无法通过这种方式获取和续订刷新 token 。

作为解决方法,您可以直接调用 Azure ad /token 端点 API,以通过旧 token 获取新刷新 token ,然后替换文件中的旧 token 。 详情见this doc 。虽然标题是刷新访问 token ,但您可以在每个请求中获取新的刷新 token : enter image description here

以便您可以在刷新 token 即将过期时刷新它。

关于node.js - MSAL Node 服务和合作伙伴中心 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68187077/

相关文章:

javascript - JSDOM 从字符串中删除尾随的新行和空格

Node.js 的 npm 安装了错误的包

azure - 如何写入日志流服务

android - 测试发布 SHA-1 授权时游戏服务 OAuth2.0 错误

php - 如何使用存储的刷新 token 获取更新的访问 token

javascript - 使用 NPM ShellJS 在 Node 中执行 Git 命令返回 `stdout` 内的空字符串

javascript - React 组件在浏览器中正确呈现,但呈现 : "Only a ReactOwner can have refs" 时 Jest 测试错误

azure - 我们可以在管理组级别拥有用户身份吗?

Azure API管理: Adding multiple Backend policies not allowed

authentication - OAuth2.0如何实现授权?