|
| 1 | +--- |
| 2 | +title: Webhook外部鉴权 |
| 3 | +weight: 09 |
| 4 | +description: "以Webhook的方式完成外部鉴权" |
| 5 | +--- |
| 6 | + |
| 7 | +KubeSphere 企业版支持设置外部身份验证,平台管理员可以通过 secret(保密字典)配置身份提供者。KubeSphere提供两种不同方式的webhook鉴权,分别为提供密码的外部鉴权方式GenericWebhookIdentityProvider,与跳转外部token提供接口以获取token的鉴权方式OAuthWebhookIdentityProvider。 |
| 8 | + |
| 9 | +### 什么是 GenericWebhookIdentityProvider: |
| 10 | + |
| 11 | +GenericWebhookIdentityProvider鉴权是基于webhook实现的身份验证机制,用户输入账号密码后,KubeSphere将信息打包以webhook加密发送给外部鉴权api,外部鉴权api鉴定完成后返回结果并附带唯一id确保用户正确,全程使用加密算法结合一个密钥对请求的主体数据Provider 通过 webhook进行签名计算。 |
| 12 | + |
| 13 | +### 什么是 OAuthWebhookIdentityProvider: |
| 14 | + |
| 15 | +OAuthWebhookIdentityProvider鉴权是以 OAuth协议为基础并结合了 webhook 技术的鉴权机制,OAuth 是一种常见的用于授权的开放标准协议,而引入 webhook 后,可以实现一些特定的回调和事件触发机制,用于外部鉴权时可在外部调用ks登录鉴权时进行响应,也具备OAuth的获取用户授权码等信息,然后将这些信息与 webhook 相关数据一起发送给 Provider 进行后续处理 |
| 16 | + |
| 17 | + |
| 18 | +### OAuthWebhookIdentityProvider 配置示例: |
| 19 | + |
| 20 | +```yaml |
| 21 | +apiVersion: v1 |
| 22 | +kind: Secret |
| 23 | +metadata: |
| 24 | + namespace: kubesphere-system |
| 25 | + #name为ks资源注册名称,字母需全小写并以“-”隔开,建议命名方式为provider名称-config |
| 26 | + name: identity-provider-config |
| 27 | + labels: |
| 28 | + config.kubesphere.io/type: identityprovider |
| 29 | +stringData: |
| 30 | + configuration.yaml: | |
| 31 | + #name为provider名称,如有版本升级用户导入场景需要与被导入用户labels中名称一致 |
| 32 | + name: oauthwebhook |
| 33 | + type: OAuthWebhookIdentityProvider |
| 34 | + mappingMethod: auto |
| 35 | + # 前端登录选项是否隐藏 |
| 36 | + hidden : false |
| 37 | + # 是否禁用该登录方式 |
| 38 | + disabled: false |
| 39 | + # 登录方式别名 |
| 40 | + displayName: "" |
| 41 | + provider: |
| 42 | + #用于认证的 API 地址 |
| 43 | + authURL: "'" |
| 44 | + #用于响应token的API 地址 |
| 45 | + tokenURL: "" |
| 46 | + readTimeout: 5000 |
| 47 | + insecureSkipVerify: true |
| 48 | + rootCA: "" |
| 49 | + rootCAData: "" |
| 50 | +type: config.kubesphere.io/identityprovider |
| 51 | +``` |
| 52 | +
|
| 53 | +### GenericWebhookIdentityProvider 配置示例: |
| 54 | +```yaml |
| 55 | +apiVersion: v1 |
| 56 | +kind: Secret |
| 57 | +metadata: |
| 58 | + namespace: kubesphere-system |
| 59 | + #name为ks资源注册名称,字母需全小写并以“-”隔开,,建议命名方式为provider名称-config |
| 60 | + name: identity-provider-config |
| 61 | + labels: |
| 62 | + config.kubesphere.io/type: identityprovider |
| 63 | +stringData: |
| 64 | + configuration.yaml: | |
| 65 | + #name为provider名称,如有版本升级用户导入场景需要与被导入用户labels中名称一致 |
| 66 | + name: generic-webhook |
| 67 | + type: GenericWebhookIdentityProvider |
| 68 | + mappingMethod: auto |
| 69 | + # 前端登录选项是否隐藏 |
| 70 | + hidden : false |
| 71 | + # 是否禁用该登录方式 |
| 72 | + disabled: false |
| 73 | + # 登录方式别名 |
| 74 | + displayName: "" |
| 75 | + provider: |
| 76 | + # 用于认证的 API 地址 |
| 77 | + authURL: "'" |
| 78 | + readTimeout: 5000 |
| 79 | + insecureSkipVerify: true |
| 80 | + rootCA: "" |
| 81 | + rootCAData: "" |
| 82 | +type: config.kubesphere.io/identityprovider |
| 83 | +``` |
| 84 | +
|
| 85 | +### 用于认证的 API 规范: |
| 86 | +
|
| 87 | +
|
| 88 | +需响应请求,返回用户的关键信息与本次查询结果 |
| 89 | +GenericWebhookIdentityProvider 对应api:AuthURL应能接受(username, password),返回连接结果、uid、username、email |
| 90 | +OAuthWebhookIdentityProvider 对应api:TokenURL应能接受GET请求发送的URL.token和其他鉴权信息并返回连接结果、uid、username、email。AuthURL应为能获取鉴权token链接,并返回给ks前端 |
| 91 | +
|
| 92 | +api接口示例: |
| 93 | +```go |
| 94 | + r.POST("/authenticate", func(c *gin.Context) { |
| 95 | + var user User |
| 96 | + if err := c.BindJSON(&user); err != nil { |
| 97 | + c.JSON(http.StatusBadRequest, err) |
| 98 | + } |
| 99 | + userInfo, err := unifieduserplatform.Authenticate(user.Username, user.Password) #外部用户密码鉴权接口调用 |
| 100 | + if err != nil { |
| 101 | + c.JSON(http.StatusBadRequest, err) #异常报错 |
| 102 | + } else { |
| 103 | + c.JSON(http.StatusOK, gin.H{"uid": strconv.Itoa(userInfo.ID), "username": userInfo.UserName, "email": userInfo.Email}) #结果回传 |
| 104 | + } |
| 105 | + }) |
| 106 | + r.GET("/oauth/redirect/aiuap", func(c *gin.Context) { |
| 107 | + token := c.Query("token") |
| 108 | + appAcctId := c.Query("appAcctId") |
| 109 | + fmt.Println(token) |
| 110 | + fmt.Println(appAcctId) |
| 111 | + userInfo, err := aiuap.IdentityExchangeCallback(token, appAcctId) #外部tokern接口鉴权调用 |
| 112 | + if err != nil { |
| 113 | + c.JSON(http.StatusBadRequest, err) #异常报错 |
| 114 | + } else { |
| 115 | + c.JSON(http.StatusOK, gin.H{"uid": userInfo.Id, "username": userInfo.Username, "email": userInfo.Email}) #异常报错 |
| 116 | + } |
| 117 | + }) |
| 118 | +``` |
0 commit comments