OAuth2 Identity Provider

概览

KubeSphere 可以通过标准的 OAuth2 协议对接外部的 OAuth2 Provider,通过外部 OAuth2 Server 完成账户认证后可以关联登录到 KubeSphere。 完整的认证流程如下:

oauth2

GitHubIdentityProvider

KubeSphere 默认提供了 GitHubIdentityProvider 做为 OAuth2 认证插件的开发示例,配置及使用方式如下:

参数配置

IdentityProvider 的参数通过 kubesphere-system 项目下 kubesphere-config 这个 ConfigMap 进行配置

通过 kubectl -n kubesphere-system edit cm kubesphere-config 进行编辑,配置示例:

  1. apiVersion: v1
  2. data:
  3. kubesphere.yaml: |
  4. authentication:
  5. authenticateRateLimiterMaxTries: 10
  6. authenticateRateLimiterDuration: 10m0s
  7. loginHistoryRetentionPeriod: 7d
  8. maximumClockSkew: 10s
  9. multipleLogin: true
  10. kubectlImage: kubesphere/kubectl:v1.0.0
  11. jwtSecret: "jwt secret"
  12. oauthOptions:
  13. accessTokenMaxAge: 1h
  14. accessTokenInactivityTimeout: 30m
  15. identityProviders:
  16. - name: github
  17. type: GitHubIdentityProvider
  18. mappingMethod: mixed
  19. provider:
  20. clientID: 'Iv1.547165ce1cf2f590'
  21. clientSecret: 'c53e80ab92d48ab12f4e7f1f6976d1bdc996e0d7'
  22. endpoint:
  23. authURL: 'https://github.com/login/oauth/authorize'
  24. tokenURL: 'https://github.com/login/oauth/access_token'
  25. redirectURL: 'https://ks-console/oauth/redirect'
  26. scopes:
  27. - user
  28. ...

authentication.oauthOptions.identityProviders 下增加 GitHubIdentityProvider 的配置块,参数示意:

字段说明
nameIdentityProvider 的唯一名称
typeIdentityProvider 插件的类型,GitHubIdentityProvider 是一种默认实现的类型
mappingMethod账户关联配置,详细说明: https://github.com/kubesphere/kubesphere/blob/master/pkg/apiserver/authentication/oauth/oauth_options.go#L37-L44
clientIDOAuth2 client ID
clientSecretOAuth2 client secret
authURLOAuth2 endpoint
tokenURLOAuth2 endpoint
redirectURL重定向到 ks-console 的跳转路径https://ks-console/oauth/redirect

重启 ks-apiserver 以更新配置: kubectl -n kubesphere-system rollout restart deploy ks-apiserver,重启完成后打开前端页面可以看到通过 通过 github 登录 按钮

github

通过 Github 账户登录 KubeSphere

github github github

账户登录到 KubeSphere 之后就可以被添加、邀请到启用空间中参与项目协同

OAuth2 插件开发

OAuth2 作为一个开放协议,解决了 API 认证授权的问题,进行账户接入还需要对用户信息接口和字段进行适配,您可以参照 GitHubIdentityProviderAliyunIDaasProvider 这两个插件进行开发,以接入您私有的账户体系。

插件开发流程:

实现 OAuthProvider 接口

  1. type OAuthProvider interface {
  2. Type() string
  3. Setup(options *oauth.DynamicOptions) (OAuthProvider, error)
  4. IdentityExchange(code string) (Identity, error)
  5. }

插件通过 kubesphere-config 中 authentication.oauthOptions.identityProviders 部分进行配置,其中 provider 是动态配置, 也就是插件中的 *oauth.DynamicOptions

插件注册

注册插件

pkg/apiserver/authentication/identityprovider/github/github.go

  1. func init() {
  2. identityprovider.RegisterOAuthProvider(&Github{})
  3. }

启用插件

/pkg/apiserver/authentication/options/authenticate_options.go

  1. import (
  2. "fmt"
  3. "github.com/spf13/pflag"
  4. _ "kubesphere.io/kubesphere/pkg/apiserver/authentication/identityprovider/aliyunidaas"
  5. _ "kubesphere.io/kubesphere/pkg/apiserver/authentication/identityprovider/github"
  6. "kubesphere.io/kubesphere/pkg/apiserver/authentication/oauth"
  7. "time"
  8. )

构建镜像

构建 ks-apiserver 的镜像 后部署到您的集群中,参照 GitHubIdentityProvider 的使用流程启用您新开发的插件。