我有一个用 TypeScript 编写的单页应用程序。它需要调用中间层服务,而中间层服务将依次调用 Microsoft Graph API。
在我的 SPA 中,我使用MSAL 库,并通过调用 UserAgentApplication.loginRedirect() 来登录用户
然后,我调用 acquireTokenPopup 并在访问令牌请求参数中仅传递一个范围:由我的中间层服务定义的范围。执行此操作后,我看到弹出窗口,但随后它消失了(我从未看到任何同意提示)。这成功获取了一个令牌,然后 SPA 将其作为 HTTPS 请求中授权标头上的承载令牌发送到中间层。
然后,中间层尝试通过调用具有如下属性的 AAD 来获取 OBO 令牌:
const grantType = "urn:ietf:params:oauth:grant-type:jwt-bearer";
const assertion = userAccessToken;
const scope = "https://graph.microsoft.com/Calendars.Read " +
"https://graph.microsoft.com/Calendars.Read.Shared " +
"https://graph.microsoft.com/Calendars.ReadWrite " +
"https://graph.microsoft.com/Calendars.ReadWrite.Shared " +
"openid profile email offline_access";
const requestedTokenUse = "on_behalf_of";
Run Code Online (Sandbox Code Playgroud)
它还具有发送的客户端机密,该机密在中间层的 AAD 注册中定义。当向 AAD 端点发出此请求以检索 OBO 令牌时,它总是失败并显示以下错误:
{"error":"invalid_grant","error_description":"AADSTS65001: The user or administrator has not consented to use the application with ID '<ID of …Run Code Online (Sandbox Code Playgroud) 我有一个函数,旨在返回值IDBValidKey或转换为IDBValidKey. 如果我使用三元运算符编写函数,它可以正常工作,但如果我将其编写为 if-else 语句,则会导致编译器错误:
interface IDBValidKeyConvertible<TConverted extends IDBValidKey> {
convertToIDBValidKey: () => TConverted;
}
function isIDBValidKeyConvertible<TConvertedDBValidKey extends IDBValidKey>(object: unknown): object is IDBValidKeyConvertible<TConvertedDBValidKey> {
return typeof((object as IDBValidKeyConvertible<TConvertedDBValidKey>).convertToIDBValidKey) === "function";
}
type IDBValidKeyOrConverted<TKey> = TKey extends IDBValidKeyConvertible<infer TConvertedKey> ? TConvertedKey : TKey;
function getKeyOrConvertedKey<TKey extends IDBValidKey | IDBValidKeyConvertible<any>>(input: TKey): IDBValidKeyOrConverted<TKey> {
if (isIDBValidKeyConvertible<IDBValidKeyOrConverted<TKey>>(input)) {
return input.convertToIDBValidKey();
} else {
return input;
}
}
function getKeyOrConvertedKeyTernary<TKey extends IDBValidKey | IDBValidKeyConvertible<any>>(input: TKey): IDBValidKeyOrConverted<TKey> {
return (isIDBValidKeyConvertible<IDBValidKeyOrConverted<TKey>>(input)) ? input.convertToIDBValidKey() : …Run Code Online (Sandbox Code Playgroud) 我有一个 Azure 函数(使用 NodeJS),我试图从中使用另一个团队发布的 npm 模块。在 npm 添加有问题的模块后,我尝试像这样使用它:
import * as Model from "@teo/app-model";
...
const appModel: Model.TheModel = new Model.TheModel([]);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行 Azure 函数时,出现此错误:
[error] Worker was unable to load function pump: 'SyntaxError: Unexpected token export'
Run Code Online (Sandbox Code Playgroud)
我可以在网上找到的与该错误消息相关的结果表明,此错误通常表明我正在尝试使用 ES6 模块,这是 Node 不支持的(相反,我应该使用 CommonJS 模块)。挑战在于我认为该模块是一个 CommonJS 模块。生成模块的项目的 tsconfig.json 在 compilerOptions 中有这一行:
"module": "commonjs"
Run Code Online (Sandbox Code Playgroud)
为了验证或排除 ES6 vs CommonJS 问题,如果我查看 Azure Function 的 node_modules 目录中导入的模块,有没有办法通过查看它来判断它是 ES6 模块还是 CommonJS 模块?
谢谢!
我正在尝试删除 Azure DevOps 构建定义,但它不允许我删除,因为它说:
“与请求的管道相关的一个或多个构建由版本保留。管道和构建不会被删除。”
然而,没有明显的方法来查看哪个版本导致构建被保留。当然,我尝试在线搜索,但如何在 Web UI 中执行此操作的所有示例/屏幕截图都显示了 Azure DevOps 网站几次迭代之前的 UI,因此所有控件看起来都不再相同。例如,我在任何地方都没有看到锁定图标。
如何找到保留这些构建定义的版本,以便删除它们,然后删除构建定义?
谢谢!
该文件告诉我什么样的影响设置/不设置这个选项的做法,但它并没有说为什么人会选择设置或不设置。
登录后我什么时候想关闭/打开“默认导航”到“起始页”?我看到如果我不设置它,它默认为 true,导致我的页面作为成功 loginRedirect 工作流程的一部分被加载三次(一次是我,两次是来自身份验证页面/代码的重定向),但如果我将其设置为 false,我的页面仅加载两次(一次由我加载,一次作为重定向的一部分)并且用户似乎仍然成功登录。
谢谢!
我有以下打字稿代码:
const myMap = new Map([["name", 5]]);
for (const foo of myMap.values()) {
console.log(foo);
}
Run Code Online (Sandbox Code Playgroud)
当我直接在 node (v8.12.0) 中运行此代码时,它会工作并将“5”打印到控制台。
如果我在 Jest 测试中运行完全相同的代码,它永远不会执行 for 循环的内容。它运行 for 条件,然后跳过循环,从不实际枚举值。
这是为什么?是否有关于 Jest 使用的 JS 运行时(不是节点吗?)不支持..of over iterables?
谢谢!
typescript ×2
azure ×1
azure-devops ×1
es6-modules ×1
javascript ×1
jestjs ×1
node-modules ×1
node.js ×1