我想创建一个简单的 VSCode 扩展,它将编辑器窗口的内容通过 REST API POST 发送到 URL。
问题是 URL 位于基于浏览器的单点登录序列后面的企业环境中,需要使用硬件令牌进行多重身份验证,并在用户通过浏览器正常登录时执行多次重定向。我不想以任何方式规避这个问题,只是简单地以某种方式验证 VSCode 扩展,以便它可以执行 POST(并且重新验证每个会话都可以,只是不是针对每个帖子)。
SSO 身份验证过程似乎适合浏览器中的多个窗口,因此例如您可以在一个窗口中登录,然后在另一个窗口中从 Javascript 执行 AJAX POSTS 到 REST API。所以我有点希望 VSCode 被视为该场景中的另一个窗口。
我正在考虑在 VSCode 本身内打开一个浏览器窗口以允许用户手动进行身份验证,然后以某种方式维护会话并且 VSCode 可以在需要时 POST 到 REST API URL? 或者可能会在外部浏览器中触发一个窗口进行身份验证,但是如何对 VSCode 进行身份验证以执行 POSTS,因为外部浏览器将是一个单独的应用程序。
客户端操作系统是 Windows 8(公司政策!)(如果有什么区别的话)。我无权修改服务器上的任何内容。
欢迎任何想法/建议,谢谢。
我不确定我是否完全正确地解决了你的问题,但我也遇到了类似的问题。
虽然有点晚了但无论如何...
我的问题是我需要 VSCode 扩展通过 SSO 通过 OAuth 提供程序进行身份验证。因此我们还需要打开浏览器并通过扩展程序接收 api_key。这是我的解决方案:
这是一个代码示例:
import { Issuer, generators } from 'openid-client';
const oidcIssuer = await Issuer.discover('your_oauth_address');
const oAuthClient = new oidcIssuer.Client({
client_id: 'your_client_id',
redirect_uris: 'http://localhost:3000',
response_types: 'code',
// The reason for the following settings you can find on: https://stackoverflow.com/questions/76588498/getting-typeerror-client-secret-basic-client-authentication-method-requires-a-c
token_endpoint_auth_method: 'none',
});
const codeVerifier = generators.codeVerifier();
const authUrl = oAuthClient.authorizationUrl({
code_challenge: generators.codeChallenge(codeVerifier),
code_challenge_method: 'S256',
scope: OAuthConfig.oidcScope,
});
// Open the URL in an browser
await vscode.env.openExternal(vscode.Uri.parse(authUrl));
// Create a server to listen on port and handle response
const app = express();
app.get('/', async (req, res) => {
const params = oAuthClient.callbackParams(req);
const tokenSet = await oAuthClient.callback('http://localhost:3000', params, { code_verifier: codeVerifier });
// Here your code to get the API Key
res.send('Login success.');
// Close the server after successful call
server.close();
server.closeAllConnections();
});
const server = app.listen(3000, () => {});