Browse Source

login opt

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

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 return nil, err
} }


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

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


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


err = CreateUser(user) err = CreateUser(user)
@@ -852,5 +859,5 @@ func LoginViaCloudBrain(user *User, login, password string, source *LoginSource)
return nil, err 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 ''"` Theme string `xorm:"NOT NULL DEFAULT ''"`


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


// SearchOrganizationsOptions options to filter organizations // SearchOrganizationsOptions options to filter organizations


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

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


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

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


const ( 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 { type RespAuth struct {
@@ -26,18 +29,43 @@ type RespAuth struct {
ErrorDescription string `json:"error_description"` 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 { type CloudBrainUser struct {
UserName string `json:"username"` UserName string `json:"username"`
Email string `json:"email"` Email string `json:"email"`
} }


func UserValidate(username string, password string) (string, error) { 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 { if err != nil {
log.Error("req user center failed:" + err.Error()) log.Error("req user center failed:" + err.Error())
return "", err return "", err
@@ -49,22 +77,56 @@ func UserValidate(username string, password string) (string, error) {
return "", err return "", err
} }


var respAuth RespAuth
err = json.Unmarshal(body, &respAuth)
var res RespToken
err = json.Unmarshal(body, &res)
if err != nil { if err != nil {
log.Error("unmarshal resp failed:" + err.Error())
log.Error("unmarshal res failed:" + err.Error())
return "", err 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) { func GetUserInfo(username string, token string) (*CloudBrainUser, error) {
user := &CloudBrainUser{} 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 return user, nil
} }

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

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


// DateLang transforms standard language locale name to corresponding value in datetime plugin. // 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") ClientID = sec.Key("CLIENT_ID").MustString("3Z377wcplxeE2qpycpjv")
ClientSecret = sec.Key("CLIENT_SECRET").MustString("J5ykfVl2kcxW0H9cawSL") ClientSecret = sec.Key("CLIENT_SECRET").MustString("J5ykfVl2kcxW0H9cawSL")
UserCeterHost = sec.Key("USER_CENTER_HOST").MustString("http://192.168.202.73:31441") 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 { func loadInternalToken(sec *ini.Section) string {


Loading…
Cancel
Save