当前位置:   article > 正文

vscode的身份验证_vscode github身份验证

vscode github身份验证

使用内置身份验证

获取session

        目前,vscode通过内置的身份验证提供程序,为第三方的插件提供身份验证服务。这两个身份验证提供程序分别是:github-authentication和microsoft-authentication。它们为第三方插件提供github和微软的身份验证服务。它们的ID分别为"github"和"microsoft"。用户通过ID访问身份验证提供程序来获得Session,如果没有特殊说明,下面的session都是指AuthenticationSession。

        访问方法如下例子:(摘自vscode内置插件github)

  1. export async function getSession(): Promise<AuthenticationSession> {
  2. return await authentication.getSession('github', scopes, { createIfNone: true });
  3. }

        它使用getSession方法获得类型为AuthenticationSession的插件对象。它的意思是:在期望的范围(scopes),获取github身份验证提供程序保存的session,如果没有则通过认证创建session。

        session中保存的数据,通常是用户身份的信息(id和用户名等)和第三方访问web应用API时所用的token。

        获取session时,有三种情况:

  1. session不存在。
  2. session可以正常读取。
  3. session可以正常读取,但是身份令牌失效了(过期)。

        为了解决上述的问题,验证机制提供了以下选项。在getSession方法的第三个参数中使用。

在session不存在的时候创建新的session。(通常会通过web浏览器进入用户登录画面)

        { createIfNone: true }
session已经失效,需要重新创建session。

        { forceNewSession: true }

身份认证信息变更

        身份信息变更,通过用户定义的事件响应通知到用户,使用方法如下例:

  1. vscode.authentication.onDidChangeSessions((e) => {
  2. console.log("认证系统触发了 onDidChangeSessions: 事件" + e.provider.id);
  3. });

上面的具体函数定义和使用方法,请参考:VS Code API | Visual Studio Code Extension API

身份访问受信插件

        第三方插件使用身份验证时,由于不受信任,需要在弹出的确认对话框中频繁点击确认。如果想让系统在不弹出确认的情况下,直接开始身份验证,需要把插件id加入到product.json的trustedExtensionAuthAccess集合中。

  1. "trustedExtensionAuthAccess": [
  2. "vscode.git",
  3. "vscode.github",
  4. "ms-vscode.remote-repositories",
  5. "github.remotehub",
  6. "ms-vscode.azure-repos",
  7. "ms-vscode.remote-server",
  8. "github.vscode-pull-request-github",
  9. "github.codespaces",
  10. "ms-vsliveshare.vsliveshare",
  11. "github.copilot"
  12. ],

自制身份验证提供程序(authenticProvider)

        通过前面的内容,您的插件就可以通过microsoft和github的账号进行授权了,但是,如果您想让您的插件登录到您的系统中,则需要制作身份验证提供程序插件。

        身份验证提供程序也是以内置插件的形式存在,通过它,访问服务器的登录页面,在用户输入用户名和密码登录服务器系统后,获得账号的访问信息。然后把它以session的方式存储到vscode的secret存储区中。

注册

        身份验证提供程序插件需要把自身注册到系统中。

        参考下面的代码(micrsoft-authenticProvider)

  1. context.subscriptions.push(vscode.authentication.registerAuthenticationProvider('microsoft', 'Microsoft', {
  2. onDidChangeSessions: onDidChangeSessions.event,
  3. getSessions: (scopes: string[]) => loginService.getSessions(scopes),
  4. createSession: async (scopes: string[]) => {
  5. try {
  6. /* __GDPR__
  7. "login" : {
  8. "owner": "TylerLeonhardt",
  9. "comment": "Used to determine the usage of the Microsoft Auth Provider.",
  10. "scopes": { "classification": "PublicNonPersonalData", "purpose": "FeatureInsight", "comment": "Used to determine what scope combinations are being requested." }
  11. }
  12. */
  13. telemetryReporter.sendTelemetryEvent('login', {
  14. // Get rid of guids from telemetry.
  15. scopes: JSON.stringify(scopes.map(s => s.replace(/[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}/i, '{guid}'))),
  16. });
  17. const session = await loginService.createSession(scopes.sort());
  18. onDidChangeSessions.fire({ added: [session], removed: [], changed: [] });
  19. return session;
  20. } catch (e) {
  21. /* __GDPR__
  22. "loginFailed" : { "owner": "TylerLeonhardt", "comment": "Used to determine how often users run into issues with the login flow." }
  23. */
  24. telemetryReporter.sendTelemetryEvent('loginFailed');
  25. throw e;
  26. }
  27. },
  28. removeSession: async (id: string) => {
  29. try {
  30. /* __GDPR__
  31. "logout" : { "owner": "TylerLeonhardt", "comment": "Used to determine how often users log out." }
  32. */
  33. telemetryReporter.sendTelemetryEvent('logout');
  34. const session = await loginService.removeSessionById(id);
  35. if (session) {
  36. onDidChangeSessions.fire({ added: [], removed: [session], changed: [] });
  37. }
  38. } catch (e) {
  39. /* __GDPR__
  40. "logoutFailed" : { "owner": "TylerLeonhardt", "comment": "Used to determine how often fail to log out." }
  41. */
  42. telemetryReporter.sendTelemetryEvent('logoutFailed');
  43. }
  44. }
  45. }, { supportsMultipleAccounts: true }));

        registerAuthenticationProvider方法的定义请参考上面提到的API。
        认证提供插件需要实现接口IAuthenticationProvider。它的方法会在创建session(登录)和销毁sessin(注销)的时候以及第三方插件申请权限时被调用。在存储的session发生变化的时候,它通过onDidChangeSessions事件,为用户插件提供事件通知。

激活插件

       身份认证提供程序插件在vscode启动后并不被直接启动,知道有用户需要的时候才会被启动。
有两种方式,可以启动身份认证提供程序插件。

方法一:通过ActivityBar的账户菜单中,可以启动插件并调用登录程序。

        请参考vscode的product.json定义

  1. "configurationSync.store": {
  2. "url": "https://vscode-sync.trafficmanager.net/",
  3. "stableUrl": "https://vscode-sync.trafficmanager.net/",
  4. "insidersUrl": "https://vscode-sync-insiders.trafficmanager.net/",
  5. "canSwitch": false,
  6. "authenticationProviders": {
  7. "github": {
  8. "scopes": [
  9. "user:email"
  10. ]
  11. },
  12. "microsoft": {
  13. "scopes": [
  14. "openid",
  15. "profile",
  16. "email",
  17. "offline_access"
  18. ]
  19. }
  20. }
  21. },
  22. "editSessions.store": {
  23. "url": "https://vscode-sync.trafficmanager.net/",
  24. "authenticationProviders": {
  25. "microsoft": {
  26. "scopes": [
  27. "openid",
  28. "profile",
  29. "email",
  30. "offline_access"
  31. ]
  32. },
  33. "github": {
  34. "scopes": [
  35. "user:email"
  36. ]
  37. }
  38. }
  39. },
  40. "tunnelApplicationName": "code-tunnel",
  41. "tunnelApplicationConfig": {
  42. "editorWebUrl": "https://vscode.dev",
  43. "extension": {
  44. "friendlyName": "Remote - Tunnels",
  45. "extensionId": "ms-vscode.remote-server"
  46. },
  47. "authenticationProviders": {
  48. "github": {
  49. "scopes": [
  50. "user:email",
  51. "read:org"
  52. ]
  53. }
  54. }
  55. },

方法二:通过用户插件的调用,用户按照正常使用getSession方法,就可以启动插件并调用登录程序。

身份验证过程

        因为身份验证需要登录到服务器,而这部分工作是在浏览器中做的,为了把身份数据传递给身份验证提供程序插件,内置的github和microsoft基本都生成了一个临时的web服务器,它负责接收身份信息。收到信息后进行保存。

        

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/606425
推荐阅读
相关标签
  

闽ICP备14008679号