如何通过浏览器 SSO 验证 VSCode 扩展以便扩展可以发布到服务器 API?

问题描述 投票:0回答:1

我想创建一个简单的 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(公司政策!)(如果有什么区别的话)。我无权修改服务器上的任何内容。

欢迎任何想法/建议,谢谢。

visual-studio-code vscode-extensions vscode-tasks
1个回答
0
投票

我不确定我是否完全正确地解决了你的问题,但我也遇到了类似的问题。 虽然有点晚了但无论如何...
我的问题是我需要 VSCode 扩展通过 SSO 通过 OAuth 提供程序进行身份验证。因此我们还需要打开浏览器并通过扩展程序接收 api_key。这是我的解决方案:

  1. 首先为此设置一个 openid 客户端,我使用了这个 openid-client
  2. 与客户端生成Auth URL并在浏览器中打开
  3. 启动服务器并监听本地端口以获取浏览器的响应
  4. 使用 oAuthProvider 的凭据获取 API 令牌

这是一个代码示例:

    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, () => {});
© www.soinside.com 2019 - 2024. All rights reserved.