Browse Source

login opt

tags/v1.21.12.1
yuyuanshifu 4 years ago
parent
commit
aacb117237
8 changed files with 93 additions and 22 deletions
  1. +1
    -0
      custom/conf/app.ini.sample
  2. BIN
      docs/opendata对外接口文档.docx
  3. BIN
      docs/云脑用户登录流程图.png
  4. BIN
      docs/开源社区与云脑平台对接方案(2)(1).docx
  5. +8
    -1
      models/login_source.go
  6. +1
    -2
      models/user.go
  7. +81
    -19
      modules/auth/cloudbrain/cloudbrain.go
  8. +2
    -0
      modules/setting/setting.go

+ 1
- 0
custom/conf/app.ini.sample View File

@@ -1052,6 +1052,7 @@ PASSWORD =
USER_CENTER_HOST = http://192.168.202.73:31441
CLIENT_ID = 3Z377wcplxeE2qpycpjv
CLIENT_SECRET = J5ykfVl2kcxW0H9cawSL
REST_SERVER_HOST = http://192.168.202.73
; cloudbrain visit opendata
USER = cW4cMtH24eoWPE7X
PWD = 4BPmgvK2hb2Eywwyp4YZRY4B7yQf4DAC


BIN
docs/opendata对外接口文档.docx View File


BIN
docs/云脑用户登录流程图.png View File

Before After
Width: 497  |  Height: 688  |  Size: 39 kB

BIN
docs/开源社区与云脑平台对接方案(2)(1).docx View File


+ 8
- 1
models/login_source.go View File

@@ -830,6 +830,12 @@ func LoginViaCloudBrain(user *User, login, password string, source *LoginSource)
return nil, err
}

if user != nil {
//todo: update token
user.Token = token
return user, UpdateUserCols(user, "token")
}

cloudBrainUser, err := cloudbrain.GetUserInfo(token, login)

if len(cloudBrainUser.Email) == 0 {
@@ -844,6 +850,7 @@ func LoginViaCloudBrain(user *User, login, password string, source *LoginSource)
LoginSource: source.ID,
LoginName: login,
IsActive: true,
Token: token,
}

err = CreateUser(user)
@@ -852,5 +859,5 @@ func LoginViaCloudBrain(user *User, login, password string, source *LoginSource)
return nil, err
}

return user, err
return user, nil
}

+ 1
- 2
models/user.go View File

@@ -167,8 +167,7 @@ type User struct {
Theme string `xorm:"NOT NULL DEFAULT ''"`

//CloudBrain
CloudBrainValidated bool `xorm:"NOT NULL DEFAULT false"`
Token string `xorm:"VARCHAR(64)"`
Token string `xorm:"VARCHAR(1024)"`
}

// SearchOrganizationsOptions options to filter organizations


+ 81
- 19
modules/auth/cloudbrain/cloudbrain.go View File

@@ -1,20 +1,23 @@
package cloudbrain

import (
"bytes"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"encoding/json"
"errors"
"io/ioutil"
"net/http"
"strings"

"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
)

const (
GrantTypePassword = "password"
ScopeRead = "read"
TokenUrl = "/oauth/token"
UrlToken = "/rest-server/api/v1/token/"
UrlGetUserInfo = "/rest-server/api/v1/user/"

TokenTypeBear = "Bearer "

SuccessCode = "S000"
)

type RespAuth struct {
@@ -26,18 +29,43 @@ type RespAuth struct {
ErrorDescription string `json:"error_description"`
}

type RespToken struct {
Code string `json:"code"`
Message string `json:"message"`
Payload PayloadToken `json:"payload"`
}

type PayloadToken struct {
Username string `json:"username"`
Token string `json:"token"`
IsAdmin bool `json:"admin"`
}

type RespUserInfo struct {
Code string `json:"code"`
Message string `json:"message"`
Payload PayloadUserInfo `json:"payload"`
}

type PayloadUserInfo struct {
UserInfo StUserInfo `json:"userInfo"`
}

type StUserInfo struct {
Email string `json:"email"`
}

type CloudBrainUser struct {
UserName string `json:"username"`
Email string `json:"email"`
}

func UserValidate(username string, password string) (string, error) {
reqHttp := "client_id=" + setting.ClientID + "&client_secret=" + setting.ClientSecret +
"&grant_type=" + GrantTypePassword + "&scope=" + ScopeRead + "&username=" + username +
"&password=" + password
resp, err := http.Post(setting.UserCeterHost + TokenUrl,
"application/x-www-form-urlencoded",
strings.NewReader(reqHttp))
values := map[string]string{"username": username, "password": password}
jsonValue, _ := json.Marshal(values)
resp, err := http.Post(setting.RestServerHost + UrlToken,
"application/json",
bytes.NewBuffer(jsonValue))
if err != nil {
log.Error("req user center failed:" + err.Error())
return "", err
@@ -49,22 +77,56 @@ func UserValidate(username string, password string) (string, error) {
return "", err
}

var respAuth RespAuth
err = json.Unmarshal(body, &respAuth)
var res RespToken
err = json.Unmarshal(body, &res)
if err != nil {
log.Error("unmarshal resp failed:" + err.Error())
log.Error("unmarshal res failed:" + err.Error())
return "", err
}

if respAuth.Error != "" {
log.Error("req user_center for token failed:" + respAuth.Error + ":" + respAuth.ErrorDescription)
return "", errors.New(respAuth.ErrorDescription)
if res.Code != SuccessCode {
log.Error("req rest-server for token failed:", res.Message)
return "", errors.New(res.Message)
}

return respAuth.AccessToken, nil
return res.Payload.Token, nil
}

func GetUserInfo(username string, token string) (*CloudBrainUser, error) {
user := &CloudBrainUser{}

client := &http.Client{}
reqHttp,err := http.NewRequest("GET", setting.RestServerHost + UrlGetUserInfo + username, strings.NewReader(""))
if err != nil {
log.Error("new req failed:", err.Error())
return nil, err
}

reqHttp.Header.Set("Authorization", TokenTypeBear + token)
resp,err := client.Do(reqHttp)
if err != nil {
log.Error("req rest-server failed:", err.Error())
return nil, err
}

body,err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Error("read resp body failed:", err.Error())
return nil, err
}

var res RespUserInfo
err = json.Unmarshal(body, &res)
if err != nil {
log.Error("unmarshal resp failed:", err.Error())
return nil, err
}

if res.Code != SuccessCode {
log.Error("get userInfo failed:", err.Error())
return nil, err
}

user.Email = res.Payload.UserInfo.Email
return user, nil
}

+ 2
- 0
modules/setting/setting.go View File

@@ -437,6 +437,7 @@ var (
ClientID string
ClientSecret string
UserCeterHost string
RestServerHost string
)

// DateLang transforms standard language locale name to corresponding value in datetime plugin.
@@ -1111,6 +1112,7 @@ func NewContext() {
ClientID = sec.Key("CLIENT_ID").MustString("3Z377wcplxeE2qpycpjv")
ClientSecret = sec.Key("CLIENT_SECRET").MustString("J5ykfVl2kcxW0H9cawSL")
UserCeterHost = sec.Key("USER_CENTER_HOST").MustString("http://192.168.202.73:31441")
RestServerHost = sec.Key("REST_SERVER_HOST").MustString("http://192.168.202.73")
}

func loadInternalToken(sec *ini.Section) string {


Loading…
Cancel
Save