✨ github oauth2 login /gitee oauth2 login
This commit is contained in:
230
api/oauth_api/gitee_api.go
Normal file
230
api/oauth_api/gitee_api.go
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
package oauth_api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
ginI18n "github.com/gin-contrib/i18n"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/yitter/idgenerator-go/idgen"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"net/http"
|
||||||
|
"schisandra-cloud-album/common/enum"
|
||||||
|
"schisandra-cloud-album/common/result"
|
||||||
|
"schisandra-cloud-album/global"
|
||||||
|
"schisandra-cloud-album/model"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GiteeUser struct {
|
||||||
|
AvatarURL string `json:"avatar_url"`
|
||||||
|
Bio string `json:"bio"`
|
||||||
|
Blog string `json:"blog"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
Email string `json:"email"`
|
||||||
|
EventsURL string `json:"events_url"`
|
||||||
|
Followers int `json:"followers"`
|
||||||
|
FollowersURL string `json:"followers_url"`
|
||||||
|
Following int `json:"following"`
|
||||||
|
FollowingURL string `json:"following_url"`
|
||||||
|
GistsURL string `json:"gists_url"`
|
||||||
|
HTMLURL string `json:"html_url"`
|
||||||
|
ID int `json:"id"`
|
||||||
|
Login string `json:"login"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
OrganizationsURL string `json:"organizations_url"`
|
||||||
|
PublicGists int `json:"public_gists"`
|
||||||
|
PublicRepos int `json:"public_repos"`
|
||||||
|
ReceivedEventsURL string `json:"received_events_url"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
ReposURL string `json:"repos_url"`
|
||||||
|
Stared int `json:"stared"`
|
||||||
|
StarredURL string `json:"starred_url"`
|
||||||
|
SubscriptionsURL string `json:"subscriptions_url"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
URL string `json:"url"`
|
||||||
|
Watched int `json:"watched"`
|
||||||
|
Weibo interface{} `json:"weibo"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGiteeRedirectUrl 获取Gitee登录地址
|
||||||
|
func (OAuthAPI) GetGiteeRedirectUrl(c *gin.Context) {
|
||||||
|
clientID := global.CONFIG.OAuth.Gitee.ClientID
|
||||||
|
redirectURI := global.CONFIG.OAuth.Gitee.RedirectURI
|
||||||
|
url := "https://gitee.com/oauth/authorize?client_id=" + clientID + "&redirect_uri=" + redirectURI + "&response_type=code"
|
||||||
|
result.OkWithData(url, c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGiteeTokenAuthUrl 获取Gitee token
|
||||||
|
func GetGiteeTokenAuthUrl(code string) string {
|
||||||
|
clientId := global.CONFIG.OAuth.Gitee.ClientID
|
||||||
|
clientSecret := global.CONFIG.OAuth.Gitee.ClientSecret
|
||||||
|
redirectURI := global.CONFIG.OAuth.Gitee.RedirectURI
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"https://gitee.com/oauth/token?grant_type=authorization_code&code=%s&client_id=%s&redirect_uri=%s&client_secret=%s",
|
||||||
|
code, clientId, redirectURI, clientSecret,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGiteeToken 获取 token
|
||||||
|
func GetGiteeToken(url string) (*Token, error) {
|
||||||
|
|
||||||
|
// 形成请求
|
||||||
|
var req *http.Request
|
||||||
|
var err error
|
||||||
|
if req, err = http.NewRequest(http.MethodPost, url, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.Header.Set("accept", "application/json")
|
||||||
|
|
||||||
|
// 发送请求并获得响应
|
||||||
|
var httpClient = http.Client{}
|
||||||
|
var res *http.Response
|
||||||
|
if res, err = httpClient.Do(req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将响应体解析为 token,并返回
|
||||||
|
var token Token
|
||||||
|
if err = json.NewDecoder(res.Body).Decode(&token); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &token, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetGiteeUserInfo 获取用户信息
|
||||||
|
func GetGiteeUserInfo(token *Token) (map[string]interface{}, error) {
|
||||||
|
|
||||||
|
// 形成请求
|
||||||
|
var userInfoUrl = "https://gitee.com/api/v5/user" // github用户信息获取接口
|
||||||
|
var req *http.Request
|
||||||
|
var err error
|
||||||
|
if req, err = http.NewRequest(http.MethodGet, userInfoUrl, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.Header.Set("accept", "application/json")
|
||||||
|
req.Header.Set("Authorization", fmt.Sprintf("token %s", token.AccessToken))
|
||||||
|
// 发送请求并获取响应
|
||||||
|
var client = http.Client{}
|
||||||
|
var res *http.Response
|
||||||
|
if res, err = client.Do(req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将响应的数据写入 userInfo 中,并返回
|
||||||
|
var userInfo = make(map[string]interface{})
|
||||||
|
if err = json.NewDecoder(res.Body).Decode(&userInfo); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return userInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GiteeCallback 处理Gitee回调
|
||||||
|
func (OAuthAPI) GiteeCallback(c *gin.Context) {
|
||||||
|
var err error
|
||||||
|
// 获取 code
|
||||||
|
var code = c.Query("code")
|
||||||
|
if code == "" {
|
||||||
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 通过 code, 获取 token
|
||||||
|
var tokenAuthUrl = GetGiteeTokenAuthUrl(code)
|
||||||
|
var token *Token
|
||||||
|
if token, err = GetGiteeToken(tokenAuthUrl); err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通过token,获取用户信息
|
||||||
|
var userInfo map[string]interface{}
|
||||||
|
if userInfo, err = GetGiteeUserInfo(token); err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
userInfoBytes, err := json.Marshal(userInfo)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var giteeUser GiteeUser
|
||||||
|
err = json.Unmarshal(userInfoBytes, &giteeUser)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Id := strconv.Itoa(giteeUser.ID)
|
||||||
|
userSocial, err := userSocialService.QueryUserSocialByUUID(Id)
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
// 第一次登录,创建用户
|
||||||
|
uid := idgen.NextId()
|
||||||
|
uidStr := strconv.FormatInt(uid, 10)
|
||||||
|
user := model.ScaAuthUser{
|
||||||
|
UID: &uidStr,
|
||||||
|
Username: &giteeUser.Login,
|
||||||
|
Nickname: &giteeUser.Name,
|
||||||
|
Avatar: &giteeUser.AvatarURL,
|
||||||
|
Blog: &giteeUser.Blog,
|
||||||
|
Email: &giteeUser.Email,
|
||||||
|
}
|
||||||
|
addUser, err := userService.AddUser(user)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
gitee := enum.OAuthSourceGitee
|
||||||
|
userSocial = model.ScaAuthUserSocial{
|
||||||
|
UserID: &addUser.ID,
|
||||||
|
UUID: &Id,
|
||||||
|
Source: &gitee,
|
||||||
|
}
|
||||||
|
err = userSocialService.AddUserSocial(userSocial)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
userRole := model.ScaAuthUserRole{
|
||||||
|
UserID: addUser.ID,
|
||||||
|
RoleID: enum.User,
|
||||||
|
}
|
||||||
|
err = userRoleService.AddUserRole(userRole)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, data := HandelUserLogin(addUser)
|
||||||
|
if !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tokenData, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formattedScript := fmt.Sprintf(script, tokenData, global.CONFIG.System.Web)
|
||||||
|
c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(formattedScript))
|
||||||
|
} else {
|
||||||
|
user, err := userService.QueryUserByUsername(giteeUser.Login)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, data := HandelUserLogin(user)
|
||||||
|
if !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tokenData, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formattedScript := fmt.Sprintf(script, tokenData, global.CONFIG.System.Web)
|
||||||
|
c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(formattedScript))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
235
api/oauth_api/github_api.go
Normal file
235
api/oauth_api/github_api.go
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
package oauth_api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
ginI18n "github.com/gin-contrib/i18n"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/yitter/idgenerator-go/idgen"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"net/http"
|
||||||
|
"schisandra-cloud-album/common/enum"
|
||||||
|
"schisandra-cloud-album/common/result"
|
||||||
|
"schisandra-cloud-album/global"
|
||||||
|
"schisandra-cloud-album/model"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Token struct {
|
||||||
|
AccessToken string `json:"access_token"`
|
||||||
|
}
|
||||||
|
type GitHubUser struct {
|
||||||
|
AvatarURL string `json:"avatar_url"`
|
||||||
|
Bio interface{} `json:"bio"`
|
||||||
|
Blog string `json:"blog"`
|
||||||
|
Company interface{} `json:"company"`
|
||||||
|
CreatedAt string `json:"created_at"`
|
||||||
|
Email string `json:"email"`
|
||||||
|
EventsURL string `json:"events_url"`
|
||||||
|
Followers int `json:"followers"`
|
||||||
|
FollowersURL string `json:"followers_url"`
|
||||||
|
Following int `json:"following"`
|
||||||
|
FollowingURL string `json:"following_url"`
|
||||||
|
GistsURL string `json:"gists_url"`
|
||||||
|
GravatarID string `json:"gravatar_id"`
|
||||||
|
Hireable interface{} `json:"hireable"`
|
||||||
|
HTMLURL string `json:"html_url"`
|
||||||
|
ID int `json:"id"`
|
||||||
|
Location interface{} `json:"location"`
|
||||||
|
Login string `json:"login"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
NodeID string `json:"node_id"`
|
||||||
|
NotificationEmail interface{} `json:"notification_email"`
|
||||||
|
OrganizationsURL string `json:"organizations_url"`
|
||||||
|
PublicGists int `json:"public_gists"`
|
||||||
|
PublicRepos int `json:"public_repos"`
|
||||||
|
ReceivedEventsURL string `json:"received_events_url"`
|
||||||
|
ReposURL string `json:"repos_url"`
|
||||||
|
SiteAdmin bool `json:"site_admin"`
|
||||||
|
StarredURL string `json:"starred_url"`
|
||||||
|
SubscriptionsURL string `json:"subscriptions_url"`
|
||||||
|
TwitterUsername interface{} `json:"twitter_username"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
UpdatedAt string `json:"updated_at"`
|
||||||
|
URL string `json:"url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetRedirectUrl 获取github登录url
|
||||||
|
func (OAuthAPI) GetRedirectUrl(c *gin.Context) {
|
||||||
|
clientId := global.CONFIG.OAuth.Github.ClientID
|
||||||
|
redirectUrl := global.CONFIG.OAuth.Github.RedirectURI
|
||||||
|
url := "https://github.com/login/oauth/authorize?client_id=" + clientId + "&redirect_uri=" + redirectUrl
|
||||||
|
result.OkWithData(url, c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTokenAuthUrl 通过code获取token认证url
|
||||||
|
func GetTokenAuthUrl(code string) string {
|
||||||
|
clientId := global.CONFIG.OAuth.Github.ClientID
|
||||||
|
clientSecret := global.CONFIG.OAuth.Github.ClientSecret
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"https://github.com/login/oauth/access_token?client_id=%s&client_secret=%s&code=%s",
|
||||||
|
clientId, clientSecret, code,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetToken 获取 token
|
||||||
|
func GetToken(url string) (*Token, error) {
|
||||||
|
|
||||||
|
// 形成请求
|
||||||
|
var req *http.Request
|
||||||
|
var err error
|
||||||
|
if req, err = http.NewRequest(http.MethodGet, url, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.Header.Set("accept", "application/json")
|
||||||
|
|
||||||
|
// 发送请求并获得响应
|
||||||
|
var httpClient = http.Client{}
|
||||||
|
var res *http.Response
|
||||||
|
if res, err = httpClient.Do(req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将响应体解析为 token,并返回
|
||||||
|
var token Token
|
||||||
|
if err = json.NewDecoder(res.Body).Decode(&token); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &token, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserInfo 获取用户信息
|
||||||
|
func GetUserInfo(token *Token) (map[string]interface{}, error) {
|
||||||
|
|
||||||
|
// 形成请求
|
||||||
|
var userInfoUrl = "https://api.github.com/user" // github用户信息获取接口
|
||||||
|
var req *http.Request
|
||||||
|
var err error
|
||||||
|
if req, err = http.NewRequest(http.MethodGet, userInfoUrl, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
req.Header.Set("accept", "application/json")
|
||||||
|
req.Header.Set("Authorization", fmt.Sprintf("token %s", token.AccessToken))
|
||||||
|
|
||||||
|
// 发送请求并获取响应
|
||||||
|
var client = http.Client{}
|
||||||
|
var res *http.Response
|
||||||
|
if res, err = client.Do(req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 将响应的数据写入 userInfo 中,并返回
|
||||||
|
var userInfo = make(map[string]interface{})
|
||||||
|
if err = json.NewDecoder(res.Body).Decode(&userInfo); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return userInfo, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback 登录回调函数
|
||||||
|
func (OAuthAPI) Callback(c *gin.Context) {
|
||||||
|
var err error
|
||||||
|
// 获取 code
|
||||||
|
var code = c.Query("code")
|
||||||
|
if code == "" {
|
||||||
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "ParamsError"), c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 通过 code, 获取 token
|
||||||
|
var tokenAuthUrl = GetTokenAuthUrl(code)
|
||||||
|
var token *Token
|
||||||
|
if token, err = GetToken(tokenAuthUrl); err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 通过token,获取用户信息
|
||||||
|
var userInfo map[string]interface{}
|
||||||
|
if userInfo, err = GetUserInfo(token); err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//json 转 struct
|
||||||
|
userInfoBytes, err := json.Marshal(userInfo)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var gitHubUser GitHubUser
|
||||||
|
err = json.Unmarshal(userInfoBytes, &gitHubUser)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Id := strconv.Itoa(gitHubUser.ID)
|
||||||
|
userSocial, err := userSocialService.QueryUserSocialByUUID(Id)
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
// 第一次登录,创建用户
|
||||||
|
uid := idgen.NextId()
|
||||||
|
uidStr := strconv.FormatInt(uid, 10)
|
||||||
|
user := model.ScaAuthUser{
|
||||||
|
UID: &uidStr,
|
||||||
|
Username: &gitHubUser.Login,
|
||||||
|
Nickname: &gitHubUser.Name,
|
||||||
|
Avatar: &gitHubUser.AvatarURL,
|
||||||
|
Blog: &gitHubUser.Blog,
|
||||||
|
Email: &gitHubUser.Email,
|
||||||
|
}
|
||||||
|
addUser, err := userService.AddUser(user)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
github := enum.OAuthSourceGithub
|
||||||
|
userSocial = model.ScaAuthUserSocial{
|
||||||
|
UserID: &addUser.ID,
|
||||||
|
UUID: &Id,
|
||||||
|
Source: &github,
|
||||||
|
}
|
||||||
|
err = userSocialService.AddUserSocial(userSocial)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
userRole := model.ScaAuthUserRole{
|
||||||
|
UserID: addUser.ID,
|
||||||
|
RoleID: enum.User,
|
||||||
|
}
|
||||||
|
err = userRoleService.AddUserRole(userRole)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, data := HandelUserLogin(addUser)
|
||||||
|
if !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tokenData, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formattedScript := fmt.Sprintf(script, tokenData, global.CONFIG.System.Web)
|
||||||
|
c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(formattedScript))
|
||||||
|
} else {
|
||||||
|
user, err := userService.QueryUserByUsername(gitHubUser.Login)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res, data := HandelUserLogin(user)
|
||||||
|
if !res {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
tokenData, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
global.LOG.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formattedScript := fmt.Sprintf(script, tokenData, global.CONFIG.System.Web)
|
||||||
|
c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(formattedScript))
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
@@ -1,3 +1,80 @@
|
|||||||
package oauth_api
|
package oauth_api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"schisandra-cloud-album/api/user_api/dto"
|
||||||
|
"schisandra-cloud-album/common/constant"
|
||||||
|
"schisandra-cloud-album/common/redis"
|
||||||
|
"schisandra-cloud-album/model"
|
||||||
|
"schisandra-cloud-album/service"
|
||||||
|
"schisandra-cloud-album/utils"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type OAuthAPI struct{}
|
type OAuthAPI struct{}
|
||||||
|
|
||||||
|
var userService = service.Service.UserService
|
||||||
|
var userRoleService = service.Service.UserRoleService
|
||||||
|
var userSocialService = service.Service.UserSocialService
|
||||||
|
var rolePermissionService = service.Service.RolePermissionService
|
||||||
|
var permissionServiceService = service.Service.PermissionService
|
||||||
|
var roleService = service.Service.RoleService
|
||||||
|
|
||||||
|
var script = `
|
||||||
|
<script>
|
||||||
|
window.opener.postMessage('%s', '%s');
|
||||||
|
window.close();
|
||||||
|
</script>
|
||||||
|
`
|
||||||
|
|
||||||
|
// HandelUserLogin 处理用户登录
|
||||||
|
func HandelUserLogin(user model.ScaAuthUser) (bool, map[string]interface{}) {
|
||||||
|
ids, err := userRoleService.GetUserRoleIdsByUserId(user.ID)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
permissionIds := rolePermissionService.QueryPermissionIdsByRoleId(ids)
|
||||||
|
permissions, err := permissionServiceService.GetPermissionsByIds(permissionIds)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
serializedPermissions, err := json.Marshal(permissions)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
wrong := redis.Set(constant.UserAuthPermissionRedisKey+*user.UID, serializedPermissions, 0).Err()
|
||||||
|
if wrong != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
roleList, err := roleService.GetRoleListByIds(ids)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
serializedRoleList, err := json.Marshal(roleList)
|
||||||
|
if err != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
er := redis.Set(constant.UserAuthRoleRedisKey+*user.UID, serializedRoleList, 0).Err()
|
||||||
|
if er != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
accessToken, refreshToken, expiresAt := utils.GenerateAccessTokenAndRefreshToken(utils.JWTPayload{UserID: user.UID, RoleID: ids})
|
||||||
|
|
||||||
|
data := dto.ResponseData{
|
||||||
|
AccessToken: accessToken,
|
||||||
|
RefreshToken: refreshToken,
|
||||||
|
ExpiresAt: expiresAt,
|
||||||
|
UID: user.UID,
|
||||||
|
}
|
||||||
|
fail := redis.Set(constant.UserLoginTokenRedisKey+*user.UID, data, time.Hour*24*7).Err()
|
||||||
|
if fail != nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
responseData := map[string]interface{}{
|
||||||
|
"code": 0,
|
||||||
|
"message": "success",
|
||||||
|
"data": data,
|
||||||
|
"success": true,
|
||||||
|
}
|
||||||
|
return true, responseData
|
||||||
|
}
|
||||||
|
1
api/oauth_api/qq_api.go
Normal file
1
api/oauth_api/qq_api.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package oauth_api
|
@@ -23,20 +23,12 @@ import (
|
|||||||
"schisandra-cloud-album/common/result"
|
"schisandra-cloud-album/common/result"
|
||||||
"schisandra-cloud-album/global"
|
"schisandra-cloud-album/global"
|
||||||
"schisandra-cloud-album/model"
|
"schisandra-cloud-album/model"
|
||||||
"schisandra-cloud-album/service"
|
|
||||||
"schisandra-cloud-album/utils"
|
"schisandra-cloud-album/utils"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var userService = service.Service.UserService
|
|
||||||
var userRoleService = service.Service.UserRoleService
|
|
||||||
var userSocialService = service.Service.UserSocialService
|
|
||||||
var rolePermissionService = service.Service.RolePermissionService
|
|
||||||
var permissionServiceService = service.Service.PermissionService
|
|
||||||
var roleService = service.Service.RoleService
|
|
||||||
|
|
||||||
// GenerateClientId 生成客户端ID
|
// GenerateClientId 生成客户端ID
|
||||||
// @Summary 生成客户端ID
|
// @Summary 生成客户端ID
|
||||||
// @Description 生成客户端ID
|
// @Description 生成客户端ID
|
||||||
@@ -281,11 +273,16 @@ func handelUserLogin(user model.ScaAuthUser, clientId string) bool {
|
|||||||
UID: user.UID,
|
UID: user.UID,
|
||||||
}
|
}
|
||||||
fail := redis.Set(constant.UserLoginTokenRedisKey+*user.UID, data, time.Hour*24*7).Err()
|
fail := redis.Set(constant.UserLoginTokenRedisKey+*user.UID, data, time.Hour*24*7).Err()
|
||||||
w := redis.Set(constant.UserLoginWechatRedisKey+clientId, data, time.Minute*5).Err()
|
if fail != nil {
|
||||||
if fail != nil || w != nil {
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
res := websocket_api.SendMessageData(clientId, data)
|
responseData := map[string]interface{}{
|
||||||
|
"code": 0,
|
||||||
|
"message": "success",
|
||||||
|
"data": data,
|
||||||
|
"success": true,
|
||||||
|
}
|
||||||
|
res := websocket_api.SendMessageData(clientId, responseData)
|
||||||
if !res {
|
if !res {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
@@ -43,7 +43,7 @@ func (UserAPI) GetUserList(c *gin.Context) {
|
|||||||
// @Router /api/auth/user/query_by_username [get]
|
// @Router /api/auth/user/query_by_username [get]
|
||||||
func (UserAPI) QueryUserByUsername(c *gin.Context) {
|
func (UserAPI) QueryUserByUsername(c *gin.Context) {
|
||||||
username := c.Query("username")
|
username := c.Query("username")
|
||||||
user := userService.QueryUserByUsername(username)
|
user, _ := userService.QueryUserByUsername(username)
|
||||||
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "NotFoundUser"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "NotFoundUser"), c)
|
||||||
return
|
return
|
||||||
@@ -117,7 +117,7 @@ func (UserAPI) AddUser(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
username := userService.QueryUserByUsername(addUserRequest.Username)
|
username, _ := userService.QueryUserByUsername(addUserRequest.Username)
|
||||||
if !reflect.DeepEqual(username, model.ScaAuthUser{}) {
|
if !reflect.DeepEqual(username, model.ScaAuthUser{}) {
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "UsernameExists"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "UsernameExists"), c)
|
||||||
return
|
return
|
||||||
@@ -214,7 +214,7 @@ func (UserAPI) AccountLogin(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
isUsername := utils.IsUsername(account)
|
isUsername := utils.IsUsername(account)
|
||||||
if isUsername {
|
if isUsername {
|
||||||
user := userService.QueryUserByUsername(account)
|
user, _ := userService.QueryUserByUsername(account)
|
||||||
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
if reflect.DeepEqual(user, model.ScaAuthUser{}) {
|
||||||
result.FailWithMessage(ginI18n.MustGetMessage(c, "UsernameNotRegister"), c)
|
result.FailWithMessage(ginI18n.MustGetMessage(c, "UsernameNotRegister"), c)
|
||||||
return
|
return
|
||||||
|
104
api/websocket_api/gws_api.go
Normal file
104
api/websocket_api/gws_api.go
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
package websocket_api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/lxzan/gws"
|
||||||
|
"net/http"
|
||||||
|
"schisandra-cloud-album/global"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
PingInterval = 5 * time.Second // 客户端心跳间隔
|
||||||
|
HeartbeatWaitTimeout = 10 * time.Second // 心跳等待超时时间
|
||||||
|
)
|
||||||
|
|
||||||
|
func (WebsocketAPI) NewGWSServer(c *gin.Context) {
|
||||||
|
var handler = NewWebSocket()
|
||||||
|
upgrader := gws.NewUpgrader(handler, &gws.ServerOption{
|
||||||
|
HandshakeTimeout: 5 * time.Second, // 握手超时时间
|
||||||
|
ReadBufferSize: 1024, // 读缓冲区大小
|
||||||
|
ParallelEnabled: true, // 开启并行消息处理
|
||||||
|
Recovery: gws.Recovery, // 开启异常恢复
|
||||||
|
CheckUtf8Enabled: true, // 开启UTF8校验
|
||||||
|
PermessageDeflate: gws.PermessageDeflate{
|
||||||
|
Enabled: true, // 开启压缩
|
||||||
|
},
|
||||||
|
Authorize: func(r *http.Request, session gws.SessionStorage) bool {
|
||||||
|
var clientId = r.URL.Query().Get("client_id")
|
||||||
|
if clientId == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
session.Store("client_id", clientId)
|
||||||
|
return true
|
||||||
|
},
|
||||||
|
})
|
||||||
|
socket, err := upgrader.Upgrade(c.Writer, c.Request)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go func() {
|
||||||
|
socket.ReadLoop() // 此处阻塞会使请求上下文不能顺利被GC
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
func MustLoad[T any](session gws.SessionStorage, key string) (v T) {
|
||||||
|
if value, exist := session.Load(key); exist {
|
||||||
|
v = value.(T)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWebSocket() *WebSocket {
|
||||||
|
return &WebSocket{
|
||||||
|
sessions: gws.NewConcurrentMap[string, *gws.Conn](64, 128),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type WebSocket struct {
|
||||||
|
gws.BuiltinEventHandler
|
||||||
|
sessions *gws.ConcurrentMap[string, *gws.Conn] // 使用内置的ConcurrentMap存储连接, 可以减少锁冲突
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *WebSocket) OnOpen(socket *gws.Conn) {
|
||||||
|
name := MustLoad[string](socket.Session(), "client_id")
|
||||||
|
if conn, ok := c.sessions.Load(name); ok {
|
||||||
|
conn.WriteClose(1000, []byte("connection is replaced"))
|
||||||
|
}
|
||||||
|
c.sessions.Store(name, socket)
|
||||||
|
global.LOG.Printf("%s connected\n", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *WebSocket) OnClose(socket *gws.Conn, err error) {
|
||||||
|
name := MustLoad[string](socket.Session(), "client_id")
|
||||||
|
sharding := c.sessions.GetSharding(name)
|
||||||
|
c.sessions.Delete(name)
|
||||||
|
sharding.Lock()
|
||||||
|
defer sharding.Unlock()
|
||||||
|
|
||||||
|
global.LOG.Printf("onerror, name=%s, msg=%s\n", name, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *WebSocket) OnPing(socket *gws.Conn, payload []byte) {
|
||||||
|
_ = socket.SetDeadline(time.Now().Add(PingInterval + HeartbeatWaitTimeout))
|
||||||
|
_ = socket.WritePong(payload)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *WebSocket) OnPong(socket *gws.Conn, payload []byte) {}
|
||||||
|
|
||||||
|
func (c *WebSocket) OnMessage(socket *gws.Conn, message *gws.Message) {
|
||||||
|
defer message.Close()
|
||||||
|
name := MustLoad[string](socket.Session(), "client_id")
|
||||||
|
if conn, ok := c.sessions.Load(name); ok {
|
||||||
|
_ = conn.WriteMessage(gws.OpcodeText, message.Bytes())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendMessageToClient 向指定客户端发送消息
|
||||||
|
func (c *WebSocket) SendMessageToClient(clientId string, message []byte) error {
|
||||||
|
conn, ok := c.sessions.Load(clientId)
|
||||||
|
if ok {
|
||||||
|
return conn.WriteMessage(gws.OpcodeText, message)
|
||||||
|
}
|
||||||
|
return fmt.Errorf("client %s not found", clientId)
|
||||||
|
}
|
@@ -1,11 +1,11 @@
|
|||||||
package websocket_api
|
package websocket_api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"schisandra-cloud-album/common/result"
|
||||||
"schisandra-cloud-album/global"
|
"schisandra-cloud-album/global"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -40,9 +40,7 @@ func (WebsocketAPI) DeleteClient(context *gin.Context) {
|
|||||||
}
|
}
|
||||||
deleteClient(id)
|
deleteClient(id)
|
||||||
} else {
|
} else {
|
||||||
context.JSON(http.StatusOK, gin.H{
|
result.FailWithMessage("客户端不存在", context)
|
||||||
"mesg": "未找到该客户端",
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
// 关闭其消息通道
|
// 关闭其消息通道
|
||||||
_, exist = getMsgChannel(id)
|
_, exist = getMsgChannel(id)
|
||||||
@@ -86,7 +84,7 @@ func WsHandler(w http.ResponseWriter, r *http.Request, id string) {
|
|||||||
var err error
|
var err error
|
||||||
var exist bool
|
var exist bool
|
||||||
// 创建一个定时器用于服务端心跳
|
// 创建一个定时器用于服务端心跳
|
||||||
//pingTicker := time.NewTicker(time.Second * 10)
|
pingTicker := time.NewTicker(time.Second * 10)
|
||||||
conn, err = wsupgrader.Upgrade(w, r, nil)
|
conn, err = wsupgrader.Upgrade(w, r, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.LOG.Println(err)
|
global.LOG.Println(err)
|
||||||
@@ -110,7 +108,7 @@ func WsHandler(w http.ResponseWriter, r *http.Request, id string) {
|
|||||||
for {
|
for {
|
||||||
_, _, err := conn.ReadMessage()
|
_, _, err := conn.ReadMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
global.LOG.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
select {
|
select {
|
||||||
@@ -118,30 +116,29 @@ func WsHandler(w http.ResponseWriter, r *http.Request, id string) {
|
|||||||
// 从消息通道接收消息,然后推送给前端
|
// 从消息通道接收消息,然后推送给前端
|
||||||
err = conn.WriteJSON(content)
|
err = conn.WriteJSON(content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.LOG.Error(err)
|
err = conn.Close()
|
||||||
err := conn.Close()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
deleteClient(id)
|
deleteClient(id)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
//case <-pingTicker.C:
|
case <-pingTicker.C:
|
||||||
// // 服务端心跳:每20秒ping一次客户端,查看其是否在线
|
// 服务端心跳:每20秒ping一次客户端,查看其是否在线
|
||||||
// err := conn.SetWriteDeadline(time.Now().Add(time.Second * 20))
|
err := conn.SetWriteDeadline(time.Now().Add(time.Second * 20))
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
// err = conn.WriteMessage(websocket.PongMessage, []byte("pong"))
|
err = conn.WriteMessage(websocket.PingMessage, []byte{})
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// log.Println("send pong err:", err)
|
log.Println("send pong err:", err)
|
||||||
// err := conn.Close()
|
err := conn.Close()
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
// deleteClient(id)
|
deleteClient(id)
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,5 +3,6 @@ package enum
|
|||||||
const (
|
const (
|
||||||
OAuthSourceWechat = "wechat"
|
OAuthSourceWechat = "wechat"
|
||||||
OAuthSourceQQ = "qq"
|
OAuthSourceQQ = "qq"
|
||||||
OAuthSourceWeibo = "weibo"
|
OAuthSourceGithub = "github"
|
||||||
|
OAuthSourceGitee = "gitee"
|
||||||
)
|
)
|
||||||
|
21
config/conf_oauth.go
Normal file
21
config/conf_oauth.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
// OAuth is the configuration of OAuth.
|
||||||
|
type OAuth struct {
|
||||||
|
Github Github `yaml:"github"`
|
||||||
|
Gitee Gitee `yaml:"gitee"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Github and GiteeConfig are the configuration of Github and Gitee OAuth.
|
||||||
|
type Github struct {
|
||||||
|
ClientID string `yaml:"client-id"`
|
||||||
|
ClientSecret string `yaml:"client-secret"`
|
||||||
|
RedirectURI string `yaml:"redirect-uri"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gitee is the configuration of Gitee OAuth.
|
||||||
|
type Gitee struct {
|
||||||
|
ClientID string `yaml:"client-id"`
|
||||||
|
ClientSecret string `yaml:"client-secret"`
|
||||||
|
RedirectURI string `yaml:"redirect-uri"`
|
||||||
|
}
|
@@ -7,6 +7,7 @@ type System struct {
|
|||||||
Host string `yaml:"host"` //主机地址
|
Host string `yaml:"host"` //主机地址
|
||||||
Port string `yaml:"port"` //端口号
|
Port string `yaml:"port"` //端口号
|
||||||
Env string `yaml:"env"` //环境
|
Env string `yaml:"env"` //环境
|
||||||
|
Web string `yaml:"web"` //web地址
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *System) Addr() string {
|
func (s *System) Addr() string {
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
type Wechat struct {
|
type Wechat struct {
|
||||||
AppID string `json:"app-id"`
|
AppID string `yaml:"app-id"`
|
||||||
AppSecret string `json:"app-secret"`
|
AppSecret string `yaml:"app-secret"`
|
||||||
Token string `json:"token"`
|
Token string `yaml:"token"`
|
||||||
AESKey string `json:"aes-key"`
|
AESKey string `yaml:"aes-key"`
|
||||||
}
|
}
|
||||||
|
@@ -9,4 +9,5 @@ type Config struct {
|
|||||||
JWT JWT `yaml:"jwt"`
|
JWT JWT `yaml:"jwt"`
|
||||||
Encrypt Encrypt `yaml:"encrypt"`
|
Encrypt Encrypt `yaml:"encrypt"`
|
||||||
Wechat Wechat `yaml:"wechat"`
|
Wechat Wechat `yaml:"wechat"`
|
||||||
|
OAuth OAuth `yaml:"oauth"`
|
||||||
}
|
}
|
||||||
|
@@ -9,10 +9,10 @@ import (
|
|||||||
|
|
||||||
func InitWechat() {
|
func InitWechat() {
|
||||||
OfficialAccountApp, err := officialAccount.NewOfficialAccount(&officialAccount.UserConfig{
|
OfficialAccountApp, err := officialAccount.NewOfficialAccount(&officialAccount.UserConfig{
|
||||||
AppID: "wx55251c2f83b9fc25",
|
AppID: global.CONFIG.Wechat.AppID,
|
||||||
Secret: "d511800cd53d248afe1260bb8aeed230",
|
Secret: global.CONFIG.Wechat.AppSecret,
|
||||||
Token: "LDQ20020618xxx",
|
Token: global.CONFIG.Wechat.Token,
|
||||||
AESKey: "",
|
AESKey: global.CONFIG.Wechat.AESKey,
|
||||||
//Log: officialAccount.Log{
|
//Log: officialAccount.Log{
|
||||||
// Level: "debug",
|
// Level: "debug",
|
||||||
// File: "./wechat.log",
|
// File: "./wechat.log",
|
||||||
|
@@ -13,15 +13,15 @@ import (
|
|||||||
|
|
||||||
// Config 全局配置文件
|
// Config 全局配置文件
|
||||||
var (
|
var (
|
||||||
CONFIG *config.Config
|
CONFIG *config.Config // 配置文件
|
||||||
DB *gorm.DB
|
DB *gorm.DB // 数据库连接
|
||||||
LOG *logrus.Logger
|
LOG *logrus.Logger // 日志
|
||||||
TextCaptcha click.Captcha
|
TextCaptcha click.Captcha // 文本验证码
|
||||||
LightTextCaptcha click.Captcha
|
LightTextCaptcha click.Captcha // 亮色文本验证码
|
||||||
ClickShapeCaptcha click.Captcha
|
ClickShapeCaptcha click.Captcha // 点击形状验证码
|
||||||
SlideCaptcha slide.Captcha
|
SlideCaptcha slide.Captcha // 滑块验证码
|
||||||
RotateCaptcha rotate.Captcha
|
RotateCaptcha rotate.Captcha // 旋转验证码
|
||||||
SlideRegionCaptcha slide.Captcha
|
SlideRegionCaptcha slide.Captcha // 滑块区域验证码
|
||||||
REDIS *redis.Client
|
REDIS *redis.Client // redis连接
|
||||||
Wechat *officialAccount.OfficialAccount
|
Wechat *officialAccount.OfficialAccount // 微信公众号
|
||||||
)
|
)
|
||||||
|
21
go.mod
21
go.mod
@@ -3,18 +3,26 @@ module schisandra-cloud-album
|
|||||||
go 1.22.5
|
go 1.22.5
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/ArtisanCloud/PowerLibs/v3 v3.2.5
|
||||||
|
github.com/ArtisanCloud/PowerWeChat/v3 v3.2.38
|
||||||
github.com/BurntSushi/toml v1.3.2
|
github.com/BurntSushi/toml v1.3.2
|
||||||
github.com/gin-contrib/cors v1.7.2
|
github.com/gin-contrib/cors v1.7.2
|
||||||
github.com/gin-contrib/i18n v1.1.3
|
github.com/gin-contrib/i18n v1.1.3
|
||||||
github.com/gin-gonic/gin v1.10.0
|
github.com/gin-gonic/gin v1.10.0
|
||||||
|
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
||||||
|
github.com/gorilla/websocket v1.5.3
|
||||||
|
github.com/pkg6/go-sms v0.1.2
|
||||||
github.com/redis/go-redis/v9 v9.6.1
|
github.com/redis/go-redis/v9 v9.6.1
|
||||||
|
github.com/satori/go.uuid v1.2.0
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/swaggo/files v1.0.1
|
github.com/swaggo/files v1.0.1
|
||||||
github.com/swaggo/gin-swagger v1.6.0
|
github.com/swaggo/gin-swagger v1.6.0
|
||||||
github.com/swaggo/swag v1.16.3
|
github.com/swaggo/swag v1.16.3
|
||||||
github.com/wenlng/go-captcha-assets v1.0.1
|
github.com/wenlng/go-captcha-assets v1.0.1
|
||||||
github.com/wenlng/go-captcha/v2 v2.0.0
|
github.com/wenlng/go-captcha/v2 v2.0.0
|
||||||
|
github.com/wumansgy/goEncrypt v1.1.0
|
||||||
|
github.com/yitter/idgenerator-go v1.3.3
|
||||||
golang.org/x/crypto v0.25.0
|
golang.org/x/crypto v0.25.0
|
||||||
golang.org/x/text v0.16.0
|
golang.org/x/text v0.16.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
@@ -25,9 +33,7 @@ require (
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
filippo.io/edwards25519 v1.1.0 // indirect
|
filippo.io/edwards25519 v1.1.0 // indirect
|
||||||
github.com/ArtisanCloud/PowerLibs/v3 v3.2.5 // indirect
|
|
||||||
github.com/ArtisanCloud/PowerSocialite/v3 v3.0.7 // indirect
|
github.com/ArtisanCloud/PowerSocialite/v3 v3.0.7 // indirect
|
||||||
github.com/ArtisanCloud/PowerWeChat/v3 v3.2.38 // indirect
|
|
||||||
github.com/KyleBanks/depth v1.2.1 // indirect
|
github.com/KyleBanks/depth v1.2.1 // indirect
|
||||||
github.com/bytedance/sonic v1.12.0 // indirect
|
github.com/bytedance/sonic v1.12.0 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.2.0 // indirect
|
github.com/bytedance/sonic/loader v0.2.0 // indirect
|
||||||
@@ -36,6 +42,7 @@ require (
|
|||||||
github.com/cloudwego/base64x v0.1.4 // indirect
|
github.com/cloudwego/base64x v0.1.4 // indirect
|
||||||
github.com/cloudwego/iasm v0.2.0 // indirect
|
github.com/cloudwego/iasm v0.2.0 // indirect
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
|
github.com/dolthub/maphash v0.1.0 // indirect
|
||||||
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.5 // indirect
|
||||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||||
@@ -45,17 +52,16 @@ require (
|
|||||||
github.com/go-playground/locales v0.14.1 // indirect
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.22.0 // indirect
|
github.com/go-playground/validator/v10 v10.22.0 // indirect
|
||||||
github.com/go-redis/redis/v8 v8.11.5 // indirect
|
|
||||||
github.com/go-sql-driver/mysql v1.8.1 // indirect
|
github.com/go-sql-driver/mysql v1.8.1 // indirect
|
||||||
github.com/goccy/go-json v0.10.3 // indirect
|
github.com/goccy/go-json v0.10.3 // indirect
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
|
||||||
github.com/gorilla/websocket v1.5.3 // indirect
|
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/josharian/intern v1.0.0 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
|
github.com/klauspost/compress v1.17.5 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
|
||||||
github.com/leodido/go-urn v1.4.0 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
|
github.com/lxzan/gws v1.8.5 // indirect
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
github.com/mailru/easyjson v0.7.7 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
@@ -65,13 +71,8 @@ require (
|
|||||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pkg6/go-requests v0.2.2 // indirect
|
github.com/pkg6/go-requests v0.2.2 // indirect
|
||||||
github.com/pkg6/go-sms v0.1.2 // indirect
|
|
||||||
github.com/satori/go.uuid v1.2.0 // indirect
|
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||||
github.com/ugorji/go/codec v1.2.12 // indirect
|
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||||
github.com/wumansgy/goEncrypt v1.1.0 // indirect
|
|
||||||
github.com/yitter/idgenerator-go v1.3.3 // indirect
|
|
||||||
go.uber.org/atomic v1.11.0 // indirect
|
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
go.uber.org/zap v1.27.0 // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
golang.org/x/arch v0.8.0 // indirect
|
golang.org/x/arch v0.8.0 // indirect
|
||||||
|
16
go.sum
16
go.sum
@@ -19,8 +19,6 @@ github.com/bytedance/sonic v1.12.0/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKz
|
|||||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||||
github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
|
github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM=
|
||||||
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||||
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
|
|
||||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
|
||||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
|
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
|
||||||
@@ -34,6 +32,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
|
|||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||||
|
github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ=
|
||||||
|
github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
|
github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
|
github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4=
|
||||||
github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
|
github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw=
|
||||||
@@ -63,8 +63,6 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
|
|||||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||||
github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao=
|
github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao=
|
||||||
github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
|
github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
|
||||||
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
|
|
||||||
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
|
|
||||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||||
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
||||||
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
||||||
@@ -99,6 +97,8 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm
|
|||||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
|
github.com/klauspost/compress v1.17.5 h1:d4vBd+7CHydUqpFBgUEKkSdtSugf9YFmSkvUYPquI5E=
|
||||||
|
github.com/klauspost/compress v1.17.5/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
|
||||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
|
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||||
@@ -109,6 +109,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
|||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
||||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
||||||
|
github.com/lxzan/gws v1.8.5 h1:6x+wW3EHtoGFNeCtZP1OVZ1IHrpZZzDaEjQGg1lUJqU=
|
||||||
|
github.com/lxzan/gws v1.8.5/go.mod h1:FcGeRMB7HwGuTvMLR24ku0Zx0p6RXqeKASeMc4VYgi4=
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
@@ -178,8 +180,8 @@ github.com/wumansgy/goEncrypt v1.1.0/go.mod h1:dWgF7mi5Ujmt8V5EoyRqjH6XtZ8wmNQyT
|
|||||||
github.com/yitter/idgenerator-go v1.3.3 h1:i6rzmpbCL0vlmr/tuW5+lSQzNuDG9vYBjIYRvnRcHE8=
|
github.com/yitter/idgenerator-go v1.3.3 h1:i6rzmpbCL0vlmr/tuW5+lSQzNuDG9vYBjIYRvnRcHE8=
|
||||||
github.com/yitter/idgenerator-go v1.3.3/go.mod h1:VVjbqFjGUsIkaXVkXEdmx1LiXUL3K1NvyxWPJBPbBpE=
|
github.com/yitter/idgenerator-go v1.3.3/go.mod h1:VVjbqFjGUsIkaXVkXEdmx1LiXUL3K1NvyxWPJBPbBpE=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||||
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
||||||
@@ -242,6 +244,8 @@ google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWn
|
|||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
@@ -9,8 +9,22 @@ var oauth = api.Api.OAuthApi
|
|||||||
|
|
||||||
func OauthRouter(router *gin.RouterGroup) {
|
func OauthRouter(router *gin.RouterGroup) {
|
||||||
group := router.Group("/oauth")
|
group := router.Group("/oauth")
|
||||||
group.GET("/generate_client_id", oauth.GenerateClientId)
|
{
|
||||||
group.GET("/get_temp_qrcode", oauth.GetTempQrCode)
|
group.GET("/generate_client_id", oauth.GenerateClientId)
|
||||||
//group.GET("/callback", oauth.CallbackVerify)
|
group.GET("/get_temp_qrcode", oauth.GetTempQrCode)
|
||||||
group.POST("/callback", oauth.CallbackNotify)
|
//group.GET("/callback", oauth.CallbackVerify)
|
||||||
|
group.POST("/callback", oauth.CallbackNotify)
|
||||||
|
|
||||||
|
githubRouter := group.Group("/github")
|
||||||
|
{
|
||||||
|
githubRouter.GET("/get_url", oauth.GetRedirectUrl)
|
||||||
|
githubRouter.GET("/callback", oauth.Callback)
|
||||||
|
}
|
||||||
|
giteeRouter := group.Group("/gitee")
|
||||||
|
{
|
||||||
|
giteeRouter.GET("/get_url", oauth.GetGiteeRedirectUrl)
|
||||||
|
giteeRouter.GET("/callback", oauth.GiteeCallback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -12,6 +12,7 @@ func WebsocketRouter(router *gin.RouterGroup) {
|
|||||||
{
|
{
|
||||||
group.GET("/socket", websocketAPI.NewSocketClient)
|
group.GET("/socket", websocketAPI.NewSocketClient)
|
||||||
group.GET("/delete", websocketAPI.DeleteClient)
|
group.GET("/delete", websocketAPI.DeleteClient)
|
||||||
|
group.GET("/gws", websocketAPI.NewGWSServer)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -8,7 +8,7 @@ import (
|
|||||||
// GetUserRoleIdsByUserId 通过用户ID获取用户角色ID列表
|
// GetUserRoleIdsByUserId 通过用户ID获取用户角色ID列表
|
||||||
func (UserRoleService) GetUserRoleIdsByUserId(userId int64) ([]*int64, error) {
|
func (UserRoleService) GetUserRoleIdsByUserId(userId int64) ([]*int64, error) {
|
||||||
var roleIds []*int64
|
var roleIds []*int64
|
||||||
if err := global.DB.Table("sca_auth_user_role").Where("user_id = ?", userId).Pluck("role_id", &roleIds).Error; err != nil {
|
if err := global.DB.Table("sca_auth_user_role").Where("user_id = ? and deleted = 0 ", userId).Pluck("role_id", &roleIds).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return roleIds, nil
|
return roleIds, nil
|
||||||
|
@@ -14,10 +14,13 @@ func (UserService) GetUserList() []*model.ScaAuthUser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// QueryUserByUsername 根据用户名查询用户
|
// QueryUserByUsername 根据用户名查询用户
|
||||||
func (UserService) QueryUserByUsername(username string) model.ScaAuthUser {
|
func (UserService) QueryUserByUsername(username string) (model.ScaAuthUser, error) {
|
||||||
authUser := model.ScaAuthUser{}
|
authUser := model.ScaAuthUser{}
|
||||||
global.DB.Where("username = ? and deleted = 0", username).First(&authUser)
|
err := global.DB.Where("username = ? and deleted = 0", username).First(&authUser).Error
|
||||||
return authUser
|
if err != nil {
|
||||||
|
return model.ScaAuthUser{}, err
|
||||||
|
}
|
||||||
|
return authUser, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryUserByUuid 根据用户uuid查询用户
|
// QueryUserByUuid 根据用户uuid查询用户
|
||||||
|
@@ -29,3 +29,16 @@ func (UserSocialService) QueryUserSocialByOpenID(openID string) (model.ScaAuthUs
|
|||||||
}
|
}
|
||||||
return user, nil
|
return user, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// QueryUserSocialByUUID 根据uuid查询用户信息
|
||||||
|
func (UserSocialService) QueryUserSocialByUUID(openID string) (model.ScaAuthUserSocial, error) {
|
||||||
|
var user model.ScaAuthUserSocial
|
||||||
|
result := global.DB.Where("uuid = ? and deleted = 0", openID).First(&user)
|
||||||
|
if result.Error != nil {
|
||||||
|
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||||||
|
return model.ScaAuthUserSocial{}, result.Error
|
||||||
|
}
|
||||||
|
return model.ScaAuthUserSocial{}, result.Error
|
||||||
|
}
|
||||||
|
return user, nil
|
||||||
|
}
|
||||||
|
@@ -1,56 +0,0 @@
|
|||||||
{"L":"INFO","timestamp":"2024-08-15T16:56:15+08:00","M":"Server response created:","content":"269685512388607999"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T16:58:26+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T16:58:27+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 08:58:27 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66bdc333-1a4b473f-4fe5f5c6\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:00:28+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:00:28+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:00:28 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66bdc3ac-59196e03-5ed1ff84\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:08:50+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:08:50+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:08:50 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66bdc5a2-10088a26-2e3835d6\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:19:18+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=wx55251c2f83b9fc25&grant_type=client_credential&neededText=&secret=d511800cd53d248afe1260bb8aeed230 request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:19:18+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 173\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:19:18 GMT\r\n\r\n{\"access_token\":\"83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT\",\"expires_in\":7200}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:19:18+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:19:18+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:19:18 GMT\r\n\r\n{\"ticket\":\"gQFJ8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyb1Fobk5TbmxjbkYxUW1sQk5DY3IAAgQWyL1mAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02oQhnNSnlcnF1QmlBNCcr\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:20:32+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT&debug=1 request header: { Accept:*/*Content-Type:application/json} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:20:32+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:20:32 GMT\r\n\r\n{\"ticket\":\"gQFX8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAycXpEVk1IbmxjbkYxUndsQjFDY0kAAgRgyL1mAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02qzDVMHnlcnF1RwlB1CcI\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:20:38+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:20:38+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:20:38 GMT\r\n\r\n{\"ticket\":\"gQFs8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyYlpseE1YbmxjbkYxUkNsQjFDYzcAAgRmyL1mAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02bZlxMXnlcnF1RClB1Cc7\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:21:32+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT&debug=1 request header: { Accept:*/*Content-Type:application/json} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:21:32+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:21:32 GMT\r\n\r\n{\"ticket\":\"gQGv8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydnlNSk5tbmxjbkYxU3NsQnhDY0oAAgScyL1mAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02vyMJNmnlcnF1SslBxCcJ\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:22:21+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:22:21+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:22:21 GMT\r\n\r\n{\"ticket\":\"gQHJ8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyaE8xaU5obmxjbkYxVGRsQmhDY1cAAgTNyL1mAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02hO1iNhnlcnF1TdlBhCcW\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:22:39+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:22:39+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:22:39 GMT\r\n\r\n{\"ticket\":\"gQHz8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyX3k1Yk5XbmxjbkYxVHZsQjFDYzMAAgTfyL1mAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02_y5bNWnlcnF1TvlB1Cc3\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:24:17+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_HgqCjNIkKPGe_jIVDhx5LSmwI8Q7Am7-Acr2FeDNla7HeXGu-A-rFCgHSrA9d2sH9eUCvo7g_0KkE6tlcpfoX75Dn8wkmmwgA-EfVwiPUOA1uMY0vy0Hf9u-6acCHMaAAAJOT&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T17:24:17+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Thu, 15 Aug 2024 09:24:17 GMT\r\n\r\n{\"ticket\":\"gQGL8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyWndrRE5GbmxjbkYxUjFtQnhDYzcAAgRByb1mAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02ZwkDNFnlcnF1R1mBxCc7\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T21:46:59+08:00","M":"Server response created:","content":"2932968073927229439"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T21:47:37+08:00","M":"Server response created:","content":"6631222197266362111"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T21:47:48+08:00","M":"Server response created:","content":"3904152095992776479"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T21:48:35+08:00","M":"Server response created:","content":"7016009957992470331"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T21:51:45+08:00","M":"Server response created:","content":"4905816075205062651"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-15T23:24:38+08:00","M":"Server response created:","content":"3390456157377093054"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-16T19:22:07+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-16T19:22:07+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Fri, 16 Aug 2024 11:22:07 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66bf365f-74a75036-6e1d3867\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T17:47:47+08:00","M":"Server response created:","content":"753244936953166311"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:16:27+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:16:27+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:16:27 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66c0787b-5e3675f0-195b0b61\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:16:55+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:16:55+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:16:55 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66c07897-09a3b67e-49f41f07\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:18:55+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:18:55+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:18:55 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66c0790f-59fe992c-18ed3d22\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:19:16+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:19:16+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:19:16 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66c07924-69688ba3-41062050\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:20:51+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:20:51+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:20:51 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66c07983-730549c5-59f35222\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:21:18+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=&grant_type=client_credential&neededText=&secret= request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:21:18+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 74\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:21:18 GMT\r\nLogicret: 41002\r\nRetkey: 11\r\n\r\n{\"errcode\":41002,\"errmsg\":\"appid missing rid: 66c0799e-158f8ada-60269170\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:22:54+08:00","M":"GET https://api.weixin.qq.com/cgi-bin/token?appid=wx55251c2f83b9fc25&grant_type=client_credential&neededText=&secret=d511800cd53d248afe1260bb8aeed230 request header: { Accept:*/*} "}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:22:54+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 173\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:22:54 GMT\r\n\r\n{\"access_token\":\"83_YrtFjPwib8kbGThSqqcLDXaz3LuRVOK4JbYO-Q1bcsHhQsSdldju-mp7Vspp_i7hp55s2moFMzwc58yBacSWpr-4qM8fdrSsbpoKm7dQrFsEFYDIPHTmR1dUnMoOHYiAEARKB\",\"expires_in\":7200}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:22:54+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_YrtFjPwib8kbGThSqqcLDXaz3LuRVOK4JbYO-Q1bcsHhQsSdldju-mp7Vspp_i7hp55s2moFMzwc58yBacSWpr-4qM8fdrSsbpoKm7dQrFsEFYDIPHTmR1dUnMoOHYiAEARKB&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"c4093d33-5bc1-11ef-8f10-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:22:54+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:22:54 GMT\r\n\r\n{\"ticket\":\"gQFK8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyOUt5Tk5FbmxjbkYxUC02RXhDY3gAAgT_ecBmAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/029KyNNEnlcnF1P-6ExCcx\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:27:17+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_YrtFjPwib8kbGThSqqcLDXaz3LuRVOK4JbYO-Q1bcsHhQsSdldju-mp7Vspp_i7hp55s2moFMzwc58yBacSWpr-4qM8fdrSsbpoKm7dQrFsEFYDIPHTmR1dUnMoOHYiAEARKB&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"c4093d33-5bc1-11ef-8f10-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:27:18+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:27:18 GMT\r\n\r\n{\"ticket\":\"gQE48DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAySnZGdk5ibmxjbkYxTTU4RTFDY3MAAgQFe8BmAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02JvFvNbnlcnF1M58E1Ccs\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:27:44+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_YrtFjPwib8kbGThSqqcLDXaz3LuRVOK4JbYO-Q1bcsHhQsSdldju-mp7Vspp_i7hp55s2moFMzwc58yBacSWpr-4qM8fdrSsbpoKm7dQrFsEFYDIPHTmR1dUnMoOHYiAEARKB&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"c4093d33-5bc1-11ef-8f10-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:27:44+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:27:44 GMT\r\n\r\n{\"ticket\":\"gQEJ8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyaENjM044bmxjbkYxTXc4RWhDY3MAAgQge8BmAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02hCc3N8nlcnF1Mw8EhCcs\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:29:49+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_YrtFjPwib8kbGThSqqcLDXaz3LuRVOK4JbYO-Q1bcsHhQsSdldju-mp7Vspp_i7hp55s2moFMzwc58yBacSWpr-4qM8fdrSsbpoKm7dQrFsEFYDIPHTmR1dUnMoOHYiAEARKB&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"c4093d33-5bc1-11ef-8f10-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:29:50+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:29:49 GMT\r\n\r\n{\"ticket\":\"gQGE8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyVGxmRk1VbmxjbkYxT3Q4RTFDY2wAAgSde8BmAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02TlfFMUnlcnF1Ot8E1Ccl\"}"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:30:06+08:00","M":"POST https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=83_YrtFjPwib8kbGThSqqcLDXaz3LuRVOK4JbYO-Q1bcsHhQsSdldju-mp7Vspp_i7hp55s2moFMzwc58yBacSWpr-4qM8fdrSsbpoKm7dQrFsEFYDIPHTmR1dUnMoOHYiAEARKB&debug=1 request header: { Content-Type:application/jsonAccept:*/*} request body:{\"action_info\":{\"scene\":{\"scene_str\":\"7cd96062-5ade-11ef-9e17-902e16172287\"}},\"action_name\":\"QR_STR_SCENE\",\"expire_seconds\":2592000}\n"}
|
|
||||||
{"L":"INFO","timestamp":"2024-08-17T18:30:06+08:00","M":"------------------response content:HTTP/1.1 200 OK\r\nContent-Length: 192\r\nConnection: keep-alive\r\nContent-Type: application/json; encoding=utf-8\r\nDate: Sat, 17 Aug 2024 10:30:06 GMT\r\n\r\n{\"ticket\":\"gQGi8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyT0tiYU0zbmxjbkYxT0s4RXhDY1AAAgSue8BmAwQAjScA\",\"expire_seconds\":2592000,\"url\":\"http:\\/\\/weixin.qq.com\\/q\\/02OKbaM3nlcnF1OK8ExCcP\"}"}
|
|
Reference in New Issue
Block a user