You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1004 lines
31 KiB
1004 lines
31 KiB
package service
|
|
|
|
import (
|
|
"context"
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"shop-api/global"
|
|
"shop-api/model"
|
|
"shop-api/model/request"
|
|
"shop-api/model/response"
|
|
"shop-api/utils"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"shop-api/initialize/api"
|
|
|
|
uuid "github.com/satori/go.uuid"
|
|
"golang.org/x/oauth2"
|
|
"golang.org/x/oauth2/google"
|
|
"golang.org/x/oauth2/instagram"
|
|
)
|
|
|
|
func UserLogin(u *request.UserLogin) (err error, userInter *model.User) {
|
|
var user model.User
|
|
switch u.Type {
|
|
case "1":
|
|
resp, err := global.SMS_CLIENT.VerifyCode(context.Background(), &api.SmsCodeVerifyRequest{
|
|
Phone: u.Phone,
|
|
Code: u.Code,
|
|
})
|
|
if err != nil {
|
|
return errors.New("验证码验证失败"), nil
|
|
}
|
|
if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {
|
|
|
|
} else if resp.Code != 0 {
|
|
return errors.New("验证码验证失败"), nil
|
|
}
|
|
err = global.MG_DB.Where("phone = ? and appid=? and type=?", u.Phone, u.Appid, "customer").Find(&user).Error
|
|
if err != nil {
|
|
return errors.New("获取用户失败"), nil
|
|
}
|
|
case "2":
|
|
code := RedisGet("email_code:" + u.Email)
|
|
if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {
|
|
|
|
} else if code != u.Code {
|
|
return errors.New("验证码验证失败"), nil
|
|
}
|
|
err = global.MG_DB.Where("email = ? and appid=? and type=?", u.Email, u.Appid, "customer").Find(&user).Error
|
|
if err != nil {
|
|
return errors.New("获取用户失败"), nil
|
|
}
|
|
}
|
|
if user.UUID == uuid.Nil {
|
|
//用户注册
|
|
user.UUID = uuid.NewV4()
|
|
user.NickName = "独立站用户"
|
|
user.Email = u.Email
|
|
user.Phone = u.Phone
|
|
user.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
|
|
user.Appid = u.Appid
|
|
user.Type = "customer"
|
|
user.CountryCode = u.CountryCode
|
|
user.Source = u.Source
|
|
err = global.MG_DB.Model(&model.User{}).Create(&user).Error
|
|
if err != nil {
|
|
return errors.New("注册失败,请稍后再试"), nil
|
|
}
|
|
var wallet model.Wallet
|
|
wallet.UserID = user.UUID.String()
|
|
wallet.Platform = "influencer"
|
|
global.MG_DB.Model(&model.Wallet{}).Create(&wallet)
|
|
}
|
|
return err, &user
|
|
}
|
|
|
|
func UserRegister(u *request.UserRegister) (err error, userInter *model.User) {
|
|
var user model.User
|
|
global.MG_DB.Where("email = ? and appid=? and type=?", u.Email, u.Appid, "customer").Find(&user)
|
|
code := RedisGet("msg_code:" + u.Email)
|
|
if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {
|
|
|
|
} else if code != u.Code {
|
|
return errors.New("验证码验证失败"), nil
|
|
}
|
|
if user.UUID == uuid.Nil {
|
|
//用户注册
|
|
user.UUID = uuid.NewV4()
|
|
user.NickName = u.Nickname
|
|
user.Email = u.Email
|
|
user.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
|
|
user.Appid = u.Appid
|
|
user.Type = "customer"
|
|
err = global.MG_DB.Model(&model.User{}).Create(&user).Error
|
|
if err != nil {
|
|
return errors.New("注册失败,请稍后再试"), nil
|
|
}
|
|
var wallet model.Wallet
|
|
wallet.UserID = user.UUID.String()
|
|
wallet.Platform = "customer"
|
|
global.MG_DB.Model(&model.Wallet{}).Create(&wallet)
|
|
} else {
|
|
return errors.New("用户已存在"), nil
|
|
}
|
|
return err, &user
|
|
}
|
|
|
|
func UserBandPhone(u *request.UserBandPhone, userID string) (err error) {
|
|
code := RedisGet("msg_code:" + u.Phone)
|
|
if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {
|
|
|
|
} else if code != u.Code {
|
|
return errors.New("验证码验证失败")
|
|
}
|
|
err = global.MG_DB.Model(&model.User{}).Where("uuid=?", userID).Update("phone", u.Phone).Error
|
|
if err != nil {
|
|
return errors.New("绑定失败")
|
|
}
|
|
return err
|
|
}
|
|
|
|
func UserPlatformAuth(u *request.UserPlatformAuth, userID string) (err error) {
|
|
var (
|
|
platformJson string
|
|
uMap = make(map[string]interface{})
|
|
)
|
|
for _, v := range u.Platform {
|
|
if v.Url != "" {
|
|
t := time.Now()
|
|
v.CreatedAt = &t
|
|
}
|
|
}
|
|
platformByte, err := json.Marshal(u.Platform)
|
|
if err != nil {
|
|
return errors.New("平台认证格式不正确")
|
|
}
|
|
platformJson = string(platformByte)
|
|
uMap["platform"] = platformJson
|
|
uMap["tags"] = u.Tags
|
|
err = global.MG_DB.Model(&model.User{}).Where("uuid=?", userID).Updates(uMap).Error
|
|
if err != nil {
|
|
return errors.New("提交失败")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetProviderList(info *request.AppProvider) (providers []model.ProviderSimple, err error) {
|
|
var (
|
|
application model.Application
|
|
provider []model.Provider
|
|
)
|
|
err = global.MG_DB.Where("appid=?", info.Appid).Find(&application).Error
|
|
if err != nil {
|
|
return providers, errors.New("获取应用失败")
|
|
}
|
|
if application.ID == 0 {
|
|
return providers, errors.New("应用不存在")
|
|
}
|
|
err = json.Unmarshal([]byte(application.Provider), &provider)
|
|
if err != nil {
|
|
return providers, errors.New("获取应用失败")
|
|
}
|
|
for _, v := range provider {
|
|
providers = append(providers, model.ProviderSimple{
|
|
Name: v.Code,
|
|
Code: v.Code,
|
|
})
|
|
}
|
|
return
|
|
}
|
|
|
|
func UserAuthorized(u *request.UserAuthorized) (Iuser model.User, err error) {
|
|
var (
|
|
aceessToken string
|
|
userID string
|
|
provider model.Provider
|
|
user model.ProviderUser
|
|
providerList model.ClentProvider
|
|
application model.Application
|
|
)
|
|
err = global.MG_DB.Where("appid=?", u.Appid).Find(&application).Error
|
|
if err != nil {
|
|
return Iuser, errors.New("获取应用失败")
|
|
}
|
|
if application.ID == 0 {
|
|
return Iuser, errors.New("应用不存在")
|
|
}
|
|
err = json.Unmarshal([]byte(application.Provider), &providerList)
|
|
if err != nil {
|
|
return Iuser, errors.New("获取应用失败")
|
|
}
|
|
switch u.Client {
|
|
case "android":
|
|
for _, v := range providerList.Android {
|
|
if v.Code == u.Platform {
|
|
provider = v
|
|
}
|
|
}
|
|
case "ios":
|
|
for _, v := range providerList.Ios {
|
|
if v.Code == u.Platform {
|
|
provider = v
|
|
}
|
|
}
|
|
default:
|
|
for _, v := range providerList.Web {
|
|
if v.Code == u.Platform {
|
|
provider = v
|
|
}
|
|
}
|
|
}
|
|
if provider.Code == "" {
|
|
return Iuser, errors.New("平台不存在")
|
|
}
|
|
if u.Uuid == "" {
|
|
if u.Code != "" {
|
|
//换取token
|
|
err, aceessToken, userID = GetAccessToken(provider, u.Code)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return Iuser, errors.New("获取token失败")
|
|
}
|
|
}
|
|
if u.Token != "" {
|
|
aceessToken = u.Token
|
|
}
|
|
//换取用户信息
|
|
if provider.UserInfoURI != "" {
|
|
err, user = GetUserInfo(provider, aceessToken, userID)
|
|
if err != nil {
|
|
return Iuser, errors.New("获取用户信息失败")
|
|
}
|
|
if user.Avatar == "" {
|
|
user.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
|
|
}
|
|
}
|
|
}
|
|
if user.UserID == "" {
|
|
return Iuser, errors.New("授权登录失败")
|
|
}
|
|
//查询用户是否存在
|
|
query := fmt.Sprintf("%s = ? AND appid = ? AND type = ?", provider.Code)
|
|
global.MG_DB.Where(query, user.UserID, u.Appid, "influencer").Find(&Iuser)
|
|
if Iuser.UUID == uuid.Nil {
|
|
//注册
|
|
Iuser.UUID = uuid.NewV4()
|
|
Iuser.NickName = user.NickName
|
|
Iuser.Avatar = user.Avatar
|
|
Iuser.Appid = u.Appid
|
|
Iuser.Type = "influencer"
|
|
switch provider.Code {
|
|
case "tiktok":
|
|
Iuser.Tiktok = user.UserID
|
|
case "facebook":
|
|
Iuser.Facebook = user.UserID
|
|
case "twitter":
|
|
Iuser.Twitter = user.UserID
|
|
case "google":
|
|
Iuser.Google = user.UserID
|
|
case "youtube":
|
|
Iuser.Youtube = user.UserID
|
|
case "instagram":
|
|
Iuser.Instagram = user.UserID
|
|
case "ios":
|
|
Iuser.Ios = user.UserID
|
|
Iuser.NickName = "ios用户"
|
|
Iuser.Avatar = "https://minio.sumweal.com/nft/221109/C82M980ZLumQCzt857yxur92iAsGdCc7271sDn8MPf666sk44V.png"
|
|
}
|
|
err = global.MG_DB.Model(&model.User{}).Create(&Iuser).Error
|
|
if err != nil {
|
|
return Iuser, errors.New("注册失败,请稍后再试")
|
|
}
|
|
//添加三方登录标识
|
|
var wallet model.Wallet
|
|
wallet.UserID = Iuser.UUID.String()
|
|
wallet.Platform = "influencer"
|
|
global.MG_DB.Model(&model.Wallet{}).Create(&wallet)
|
|
return Iuser, nil
|
|
}
|
|
return Iuser, nil
|
|
}
|
|
|
|
func GetAccessToken(provider model.Provider, Code string) (err error, aceessToken string, userID string) {
|
|
//发送post请求
|
|
switch provider.Code {
|
|
case "tiktok":
|
|
aceessToken, err = GetTiktokAccessToken(provider.ClientID, provider.ClientSecret, Code, provider.RedirectURI)
|
|
case "facebook":
|
|
//facebook可以直接获取token 暂不提供
|
|
case "twitter":
|
|
aceessToken, err = GetTwitterAccessToken(provider.ClientID, provider.ClientSecret, Code, provider.RedirectURI)
|
|
case "google":
|
|
var (
|
|
googleOauthConfig = &oauth2.Config{
|
|
RedirectURL: provider.RedirectURI,
|
|
ClientID: provider.ClientID,
|
|
ClientSecret: provider.ClientSecret,
|
|
Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
|
|
Endpoint: google.Endpoint,
|
|
}
|
|
token *oauth2.Token
|
|
)
|
|
token, err = googleOauthConfig.Exchange(context.Background(), Code)
|
|
if err != nil {
|
|
return err, aceessToken, ""
|
|
}
|
|
aceessToken = token.AccessToken
|
|
case "youtube":
|
|
var (
|
|
googleOauthConfig = &oauth2.Config{
|
|
RedirectURL: provider.RedirectURI,
|
|
ClientID: provider.ClientID,
|
|
ClientSecret: provider.ClientSecret,
|
|
Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
|
|
Endpoint: google.Endpoint,
|
|
}
|
|
token *oauth2.Token
|
|
)
|
|
fmt.Println(provider, Code)
|
|
token, err = googleOauthConfig.Exchange(context.Background(), Code)
|
|
if err != nil {
|
|
return err, aceessToken, ""
|
|
}
|
|
aceessToken = token.AccessToken
|
|
case "instagram":
|
|
var (
|
|
instagramOauthConfig = &oauth2.Config{
|
|
RedirectURL: provider.RedirectURI,
|
|
ClientID: provider.ClientID,
|
|
ClientSecret: provider.ClientSecret,
|
|
Scopes: []string{"user_profile"},
|
|
Endpoint: instagram.Endpoint,
|
|
}
|
|
)
|
|
token, err := instagramOauthConfig.Exchange(context.Background(), Code)
|
|
fmt.Println(token)
|
|
if err != nil {
|
|
return err, aceessToken, ""
|
|
}
|
|
aceessToken = token.AccessToken
|
|
userID = strconv.Itoa(int(token.Extra("user_id").(float64)))
|
|
default:
|
|
}
|
|
return
|
|
}
|
|
|
|
func GetUserInfo(provider model.Provider, aceessToken, userID string) (err error, user model.ProviderUser) {
|
|
switch provider.Code {
|
|
case "tiktok":
|
|
tuser, err := getUserInfo(aceessToken)
|
|
if err != nil {
|
|
fmt.Println("Error:", err)
|
|
return err, user
|
|
}
|
|
user.UserID = tuser.OpenID
|
|
user.NickName = tuser.DisplayName
|
|
user.Avatar = tuser.AvatarURL
|
|
return nil, user
|
|
case "facebook":
|
|
var userID string
|
|
//校验token
|
|
tokenCheckURI := provider.TokenCheckURI + "?input_token=" + aceessToken + "&access_token=" + getAccessToken(provider.ClientID, provider.ClientSecret)
|
|
err, userID := DebugFacebookToken(aceessToken, tokenCheckURI)
|
|
if err != nil {
|
|
return errors.New("token校验失败"), user
|
|
}
|
|
//获取用户信息
|
|
userInfoURI := strings.Replace(provider.UserInfoURI, "USER-ID", userID, 1)
|
|
userInfoURI = userInfoURI + "&access_token=" + getAccessToken(provider.ClientID, provider.ClientSecret)
|
|
faceUser, err := getThirdPartyLoginUserBO(userInfoURI)
|
|
if err != nil {
|
|
return errors.New("获取用户信息失败"), user
|
|
}
|
|
user.UserID = userID
|
|
user.NickName = faceUser.UserName
|
|
user.Email = faceUser.Email
|
|
user.Avatar = faceUser.Picture.Data.URL
|
|
return nil, user
|
|
case "instagram":
|
|
resp, err1 := http.Get(provider.UserInfoURI + userID + fmt.Sprintf("?fields=%v&access_token=%v", "id,username", aceessToken))
|
|
if err1 != nil {
|
|
fmt.Println("Failed to get user info: ", err.Error())
|
|
return
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
content, err1 := io.ReadAll(resp.Body)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to read response body: ", err1.Error())
|
|
return
|
|
}
|
|
fmt.Println("Response body: ", string(content))
|
|
var googleUser response.TripartiteInstagram
|
|
err1 = json.Unmarshal(content, &googleUser)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to read response body: ", err1.Error())
|
|
return
|
|
}
|
|
user.UserID = googleUser.ID
|
|
user.NickName = googleUser.Username
|
|
case "twitter":
|
|
user, err = getTwitterUserInfo(provider, aceessToken)
|
|
return err, user
|
|
case "google":
|
|
resp, err1 := http.Get("https://oauth2.googleapis.com/tokeninfo?id_token=" + aceessToken)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to get user info: ", err.Error())
|
|
return
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
content, err1 := io.ReadAll(resp.Body)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to read response body: ", err1.Error())
|
|
return
|
|
}
|
|
var googleUser response.TripartiteGoogle
|
|
err1 = json.Unmarshal(content, &googleUser)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to read response body: ", err1.Error())
|
|
return
|
|
}
|
|
user.UserID = googleUser.Sub
|
|
user.NickName = googleUser.Name
|
|
// user.Email = googleUser.Email
|
|
user.Avatar = googleUser.Picture
|
|
fmt.Println("Response body: ", string(content))
|
|
case "youtube":
|
|
resp, err1 := http.Get("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + aceessToken)
|
|
fmt.Println("https://www.googleapis.com/oauth2/v2/userinfo?access_token=" + aceessToken)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to get user info: ", err1.Error())
|
|
return
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
content, err1 := io.ReadAll(resp.Body)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to read response body: ", err1.Error())
|
|
return
|
|
}
|
|
var googleUser response.TripartiteGoogle
|
|
err1 = json.Unmarshal(content, &googleUser)
|
|
if err1 != nil {
|
|
fmt.Println("Failed to read response body: ", err1.Error())
|
|
return
|
|
}
|
|
user.UserID = googleUser.ID
|
|
user.NickName = googleUser.Name
|
|
// user.Email = googleUser.Email
|
|
user.Avatar = googleUser.Picture
|
|
fmt.Println("Response body: ", string(content))
|
|
default:
|
|
}
|
|
return
|
|
}
|
|
|
|
func DebugFacebookToken(accessToken, url string) (err error, userID string) {
|
|
// 构建请求
|
|
req, err := http.NewRequest("GET", url, nil)
|
|
if err != nil {
|
|
return err, ""
|
|
}
|
|
|
|
// 发送请求
|
|
client := http.Client{}
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return err, ""
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
// 读取响应数据
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return err, ""
|
|
}
|
|
|
|
// 解析响应数据
|
|
var result map[string]interface{}
|
|
if err := json.Unmarshal(body, &result); err != nil {
|
|
return err, ""
|
|
}
|
|
// 提取 access_token
|
|
userID, ok := result["data"].(map[string]interface{})["user_id"].(string)
|
|
if !ok {
|
|
return errors.New("未能获取有效的user_id"), ""
|
|
}
|
|
return nil, userID
|
|
}
|
|
|
|
func GetTiktokAccessToken(clientKey, clientSecret, code, redirectURI string) (string, error) {
|
|
// 构建请求体
|
|
data := url.Values{}
|
|
data.Set("client_key", clientKey)
|
|
data.Set("client_secret", clientSecret)
|
|
data.Set("code", code)
|
|
data.Set("grant_type", "authorization_code")
|
|
data.Set("redirect_uri", redirectURI)
|
|
|
|
// 构建请求
|
|
req, err := http.NewRequest("POST", "https://open.tiktokapis.com/v2/oauth/token", strings.NewReader(data.Encode()))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 设置请求头
|
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
|
|
// 发送请求
|
|
client := http.Client{}
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
// 读取响应数据
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 解析响应数据
|
|
var result map[string]interface{}
|
|
if err := json.Unmarshal(body, &result); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 检查是否返回错误
|
|
if errorMsg, ok := result["error_description"].(string); ok {
|
|
return "", fmt.Errorf("获取 access token 失败:%s", errorMsg)
|
|
}
|
|
|
|
// 提取 access_token
|
|
accessToken, ok := result["access_token"].(string)
|
|
if !ok {
|
|
return "", fmt.Errorf("未能获取有效的 access token")
|
|
}
|
|
|
|
return accessToken, nil
|
|
}
|
|
|
|
func GetTwitterAccessToken(clientKey, clientSecret, code, redirectURI string) (string, error) {
|
|
// 构建请求体
|
|
data := url.Values{}
|
|
data.Set("code", code)
|
|
data.Set("grant_type", "authorization_code")
|
|
data.Set("client_id", clientKey)
|
|
data.Set("redirect_uri", redirectURI)
|
|
data.Set("code_verifier", "challenge")
|
|
|
|
req, err := http.NewRequest("POST", "https://api.twitter.com/2/oauth2/token", strings.NewReader(data.Encode()))
|
|
if err != nil {
|
|
// handle error
|
|
}
|
|
fmt.Println(data.Encode())
|
|
// 设置请求头
|
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
|
req.Header.Set("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(clientKey+":"+clientSecret)))
|
|
|
|
// 发送请求
|
|
client := http.Client{}
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
// 读取响应数据
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
fmt.Println(string(body))
|
|
// 解析响应数据
|
|
var result map[string]interface{}
|
|
if err := json.Unmarshal(body, &result); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
// 检查是否返回错误
|
|
if errorMsg, ok := result["error_description"].(string); ok {
|
|
return "", fmt.Errorf("获取 access token 失败:%s", errorMsg)
|
|
}
|
|
|
|
// 提取 access_token
|
|
accessToken, ok := result["access_token"].(string)
|
|
if !ok {
|
|
return "", fmt.Errorf("未能获取有效的 access token")
|
|
}
|
|
|
|
return accessToken, nil
|
|
}
|
|
|
|
func getThirdPartyLoginUserBO(url string) (model.FacebookUserInfo, error) {
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return model.FacebookUserInfo{}, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
|
|
return model.FacebookUserInfo{}, fmt.Errorf("Facebook请求查询用户接口失败,响应为%d", resp.StatusCode)
|
|
}
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return model.FacebookUserInfo{}, err
|
|
}
|
|
|
|
var userInfo model.FacebookUserInfo
|
|
err = json.Unmarshal(body, &userInfo)
|
|
if err != nil {
|
|
return model.FacebookUserInfo{}, err
|
|
}
|
|
|
|
return userInfo, nil
|
|
}
|
|
|
|
func getAccessToken(clientId string, clientSecret string) string {
|
|
return url.QueryEscape(clientId + "|" + clientSecret)
|
|
}
|
|
|
|
func UserAppeal(u *request.UserAppeal, userID string) (err error) {
|
|
var appeal model.UserAppeal
|
|
appeal.UserID = userID
|
|
appeal.Respon = u.Respon
|
|
appeal.Contact = u.Contact
|
|
appeal.Images = u.Images
|
|
appeal.Status = 0
|
|
err = global.MG_DB.Model(&model.UserAppeal{}).Create(&appeal).Error
|
|
if err != nil {
|
|
return errors.New("申诉失败")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func UserEmail(u *request.UserEmail, userID, appid string) (err error) {
|
|
var (
|
|
user model.User
|
|
)
|
|
code := RedisGet("email_code:" + u.Email)
|
|
if global.MG_CONFIG.System.Env != "prod" && u.Code == "888888" {
|
|
|
|
} else if code != u.Code {
|
|
return errors.New("验证码验证失败")
|
|
}
|
|
err = global.MG_DB.Where("uuid=? and appid=?", userID, appid).Find(&user).Error
|
|
if err != nil {
|
|
return errors.New("获取用户失败")
|
|
}
|
|
if user.UUID == uuid.Nil {
|
|
return errors.New("用户不存在")
|
|
}
|
|
if user.Email != "" {
|
|
return errors.New("邮箱已绑定")
|
|
}
|
|
err = global.MG_DB.Model(&model.User{}).Where("uuid=? and appid=?", userID, appid).Update("email", u.Email).Error
|
|
if err != nil {
|
|
return errors.New("绑定失败")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetProviderAuthUrl(u *request.ProviderAuth) (err error, url string) {
|
|
var (
|
|
provider model.Provider
|
|
application model.Application
|
|
providerList model.ClentProvider
|
|
)
|
|
err = global.MG_DB.Where("appid=?", u.Appid).Find(&application).Error
|
|
if err != nil {
|
|
return errors.New("获取应用失败"), ""
|
|
}
|
|
if application.ID == 0 {
|
|
return errors.New("应用不存在"), ""
|
|
}
|
|
err = json.Unmarshal([]byte(application.Provider), &providerList)
|
|
if err != nil {
|
|
return errors.New("获取应用失败"), ""
|
|
}
|
|
switch u.Client {
|
|
case "android":
|
|
for _, v := range providerList.Android {
|
|
if v.Code == u.Platform {
|
|
provider = v
|
|
}
|
|
}
|
|
case "ios":
|
|
for _, v := range providerList.Ios {
|
|
if v.Code == u.Platform {
|
|
provider = v
|
|
}
|
|
}
|
|
default:
|
|
for _, v := range providerList.Web {
|
|
if v.Code == u.Platform {
|
|
provider = v
|
|
}
|
|
}
|
|
}
|
|
if provider.Code == "" {
|
|
return errors.New("平台不存在"), ""
|
|
}
|
|
switch provider.Code {
|
|
case "tiktok":
|
|
url = strings.Replace(provider.AuthURI, "<client_key>", provider.ClientID, 1)
|
|
url = strings.Replace(url, "<scope>", provider.Scope, 1)
|
|
url = strings.Replace(url, "<redirect_uri>", provider.RedirectURI, 1)
|
|
url = strings.Replace(url, "<state>", "tiktok", 1)
|
|
case "facebook":
|
|
url = strings.Replace(provider.AuthURI, "{app-id}", provider.ClientID, 1)
|
|
url = strings.Replace(url, "{redirect-uri}", provider.RedirectURI, 1)
|
|
url = strings.Replace(url, "{state-param}", "facebook", 1)
|
|
case "instagram":
|
|
var (
|
|
instagramOauthConfig = &oauth2.Config{
|
|
RedirectURL: provider.RedirectURI,
|
|
ClientID: provider.ClientID,
|
|
ClientSecret: provider.ClientSecret,
|
|
Scopes: []string{"user_profile"},
|
|
Endpoint: instagram.Endpoint,
|
|
}
|
|
)
|
|
url = instagramOauthConfig.AuthCodeURL("instagram")
|
|
case "twitter":
|
|
url = strings.Replace(provider.AuthURI, "<client_id>", provider.ClientID, 1)
|
|
url = strings.Replace(url, "<scope>", provider.Scope, 1)
|
|
url = strings.Replace(url, "<redirect_uri>", provider.RedirectURI, 1)
|
|
url = strings.Replace(url, "<state>", "twitter", 1)
|
|
url = strings.Replace(url, "<code_challenge>", "challenge", 1)
|
|
url = strings.Replace(url, "<code_challenge_method>", "plain", 1)
|
|
case "youtube":
|
|
var (
|
|
googleOauthConfig = &oauth2.Config{
|
|
RedirectURL: provider.RedirectURI,
|
|
ClientID: provider.ClientID,
|
|
ClientSecret: provider.ClientSecret,
|
|
Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
|
|
Endpoint: google.Endpoint,
|
|
}
|
|
)
|
|
url = googleOauthConfig.AuthCodeURL("youtube")
|
|
case "google":
|
|
var (
|
|
googleOauthConfig = &oauth2.Config{
|
|
RedirectURL: provider.RedirectURI,
|
|
ClientID: provider.ClientID,
|
|
ClientSecret: provider.ClientSecret,
|
|
Scopes: []string{"https://www.googleapis.com/auth/userinfo.profile", "https://www.googleapis.com/auth/userinfo.email"},
|
|
Endpoint: google.Endpoint,
|
|
}
|
|
)
|
|
url = googleOauthConfig.AuthCodeURL("google")
|
|
default:
|
|
}
|
|
fmt.Println(url)
|
|
return nil, url
|
|
}
|
|
|
|
func getUserInfo(token string) (*model.TiktokUser, error) {
|
|
url := "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name"
|
|
req, err := http.NewRequest("GET", url, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req.Header.Add("Authorization", "Bearer "+token)
|
|
|
|
res, err := http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer res.Body.Close()
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var response response.TiktokResponse
|
|
err = json.Unmarshal(body, &response)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if response.Error.Code != "ok" {
|
|
return nil, fmt.Errorf("API error: %s", response.Error.Message)
|
|
}
|
|
|
|
return &response.Data.User, nil
|
|
}
|
|
|
|
func getTwitterUserInfo(provider model.Provider, aceessToken string) (model.ProviderUser, error) {
|
|
var result response.TripartiteTwitter
|
|
var user model.ProviderUser
|
|
req, err := http.NewRequest("GET", provider.UserInfoURI, nil)
|
|
if err != nil {
|
|
// handle error
|
|
return user, err
|
|
}
|
|
|
|
req.Header.Add("Authorization", "Bearer "+aceessToken)
|
|
|
|
client := &http.Client{}
|
|
resp, err := client.Do(req)
|
|
if err != nil {
|
|
// handle error
|
|
return user, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
// handle error
|
|
return user, err
|
|
}
|
|
fmt.Println("------twitter", string(body))
|
|
err = json.Unmarshal(body, &result)
|
|
if err != nil {
|
|
// handle error
|
|
fmt.Println("------twitter", err)
|
|
return user, err
|
|
}
|
|
user.UserID = result.Data.ID
|
|
user.NickName = result.Data.Name
|
|
return user, err
|
|
}
|
|
|
|
func getUser(uuid string) (model.User, error) {
|
|
var (
|
|
err error
|
|
result model.User
|
|
)
|
|
err = global.MG_DB.Model(&model.User{}).Where("uuid = ?", uuid).First(&result).Error
|
|
return result, err
|
|
}
|
|
|
|
func AppProviderInit() {
|
|
var (
|
|
clients model.ClentProvider
|
|
providers []model.Provider
|
|
)
|
|
providers = append(providers, model.Provider{
|
|
Code: "google",
|
|
ClientID: "411647813390-7h52imq0t8mk1k48kr72tvces043a1i8.apps.googleusercontent.com",
|
|
ClientSecret: "411647813390-7h52imq0t8mk1k48kr72tvces043a1i8.apps.googleusercontent.com",
|
|
Scope: "https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email",
|
|
RedirectURI: "http://localhost:8080/auth/google/callback",
|
|
AuthURI: "",
|
|
TokenURI: "",
|
|
UserInfoURI: "https://www.googleapis.com/oauth2/v2/userinfo",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "facebook",
|
|
ClientID: "2022993034711459",
|
|
ClientSecret: "eaab719570279138cf977ac807936f51",
|
|
Scope: "user_profile",
|
|
RedirectURI: "http://localhost:8000",
|
|
AuthURI: "https://www.facebook.com/v18.0/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}&response_type=token",
|
|
TokenURI: "https://graph.facebook.com/v18.0/oauth/access_token?client_id={app-id}&redirect_uri={redirect-uri}&client_secret={app-secret}&code={code-parameter}",
|
|
TokenCheckURI: "https://graph.facebook.com/debug_token",
|
|
UserInfoURI: "https://graph.facebook.com/USER-ID?fields=id,name,email,picture",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "twitter",
|
|
ClientID: "kkx47j7W1QBJowXqK10F2dBxw",
|
|
ClientSecret: "kXaP0TFIQ6A2wuH4xbGa8yDonqGAuWAmXa3vSqL5yPVaqU5e7y",
|
|
Scope: "tweet.read%20users.read",
|
|
RedirectURI: "https://www.baidu.com",
|
|
AuthURI: "https://twitter.com/i/oauth2/authorize?client_id=<client_id>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>&code_challenge=<code_challenge>&code_challenge_method=<code_challenge_method>",
|
|
TokenURI: "https://api.twitter.com/2/oauth2/token",
|
|
TokenType: "Bearer",
|
|
UserInfoURI: "https://api.twitter.com/2/user",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "tiktok",
|
|
ClientID: "awfcivkstde78lmu",
|
|
ClientSecret: "",
|
|
Scope: "user.info.basic",
|
|
RedirectURI: "",
|
|
AuthURI: "https://www.tiktok.com/v2/auth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
|
|
TokenURI: "https://open.tiktokapis.com/v2/oauth/token?",
|
|
UserInfoURI: "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name",
|
|
})
|
|
clients.Android = providers
|
|
providers = []model.Provider{}
|
|
providers = append(providers, model.Provider{
|
|
Code: "youtube",
|
|
ClientID: "560948330734-u9lhqedsn90cb3jguopr6afrf64nmejs.apps.googleusercontent.com",
|
|
ClientSecret: "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",
|
|
Scope: "https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email",
|
|
RedirectURI: "https://h5-dev.bkbackground.com/loading",
|
|
AuthURI: "",
|
|
TokenURI: "",
|
|
UserInfoURI: "https://www.googleapis.com/oauth2/v2/userinfo",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "facebook",
|
|
ClientID: "1404974307098155",
|
|
ClientSecret: "277467943e199b1cdf57ea4835f603a2",
|
|
Scope: "user_profile",
|
|
RedirectURI: "https://h5-dev.bkbackground.com/loading",
|
|
AuthURI: "https://www.facebook.com/v18.0/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}&response_type=token",
|
|
TokenURI: "https://graph.facebook.com/v18.0/oauth/access_token?client_id={app-id}&redirect_uri={redirect-uri}&client_secret={app-secret}&code={code-parameter}",
|
|
TokenCheckURI: "https://graph.facebook.com/debug_token",
|
|
UserInfoURI: "https://graph.facebook.com/USER-ID?fields=id,name,email,picture",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "twitter",
|
|
ClientID: "ZEp6VUUwVG9ybl9JampHbHNkYmo6MTpjaQ",
|
|
ClientSecret: "PT_gMm2PQ44QCl3M08AnRr8cm3_98AupHTTRMPTATZFMXQL2aI",
|
|
Scope: "tweet.read%20users.read",
|
|
RedirectURI: "https://h5-dev.bkbackground.com/loading",
|
|
AuthURI: "https://twitter.com/i/oauth2/authorize?client_id=<client_id>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>&code_challenge=<code_challenge>&code_challenge_method=<code_challenge_method>",
|
|
TokenURI: "https://api.twitter.com/2/oauth2/token",
|
|
TokenType: "Bearer",
|
|
UserInfoURI: "https://api.twitter.com/2/users/me",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "tiktok",
|
|
ClientID: "awct4oqq4618322e",
|
|
ClientSecret: "Qjv1Q89yexn3FFCbGeqY85UnKFrL2JTW",
|
|
Scope: "user.info.basic",
|
|
RedirectURI: "https://h5-dev.bkbackground.com/loading",
|
|
AuthURI: "https://www.tiktok.com/v2/auth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
|
|
TokenURI: "https://open.tiktokapis.com/v2/oauth/token?",
|
|
UserInfoURI: "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "instagram",
|
|
ClientID: "358175333242276",
|
|
ClientSecret: "96fc00c184619bdc13803fa976bc81fb",
|
|
Scope: "user_profile",
|
|
RedirectURI: "https://h5-dev.bkbackground.com/loading",
|
|
AuthURI: "https://api.instagram.com/oauth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
|
|
TokenURI: "https://api.instagram.com/oauth/access_token",
|
|
TokenType: "Bearer",
|
|
UserInfoURI: "https://graph.instagram.com/v18.0/",
|
|
})
|
|
clients.Web = providers
|
|
providers = []model.Provider{}
|
|
providers = append(providers, model.Provider{
|
|
Code: "google",
|
|
ClientID: "10001",
|
|
ClientSecret: "560948330734-6d6vpdv3m4003f1tmodbs5v4lm7nft4q.apps.googleusercontent.com",
|
|
Scope: "https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email",
|
|
RedirectURI: "",
|
|
AuthURI: "",
|
|
TokenURI: "",
|
|
UserInfoURI: "https://www.googleapis.com/oauth2/v2/userinfo",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "facebook",
|
|
ClientID: "2022993034711459",
|
|
ClientSecret: "eaab719570279138cf977ac807936f51",
|
|
Scope: "user_profile",
|
|
RedirectURI: "",
|
|
AuthURI: "https://www.facebook.com/v18.0/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}&response_type=token",
|
|
TokenURI: "https://graph.facebook.com/v18.0/oauth/access_token?client_id={app-id}&redirect_uri={redirect-uri}&client_secret={app-secret}&code={code-parameter}",
|
|
TokenCheckURI: "https://graph.facebook.com/debug_token",
|
|
UserInfoURI: "https://graph.facebook.com/USER-ID?fields=id,name,email,picture",
|
|
})
|
|
providers = append(providers, model.Provider{
|
|
Code: "ios",
|
|
})
|
|
// providers = append(providers, model.Provider{
|
|
// Code: "twitter",
|
|
// ClientID: "kkx47j7W1QBJowXqK10F2dBxw",
|
|
// ClientSecret: "kXaP0TFIQ6A2wuH4xbGa8yDonqGAuWAmXa3vSqL5yPVaqU5e7y",
|
|
// Scope: "tweet.read%20users.read",
|
|
// RedirectURI: "https://www.baidu.com",
|
|
// AuthURI: "https://twitter.com/i/oauth2/authorize?client_id=<client_id>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>&code_challenge=<code_challenge>&code_challenge_method=<code_challenge_method>",
|
|
// TokenURI: "https://api.twitter.com/2/oauth2/token",
|
|
// TokenType: "Bearer",
|
|
// UserInfoURI: "https://api.twitter.com/2/user",
|
|
// })
|
|
// providers = append(providers, model.Provider{
|
|
// Code: "tiktok",
|
|
// ClientID: "awfcivkstde78lmu",
|
|
// ClientSecret: "",
|
|
// Scope: "user.info.basic",
|
|
// RedirectURI: "",
|
|
// AuthURI: "https://www.tiktok.com/v2/auth/authorize?client_key=<client_key>&response_type=code&scope=<scope>&redirect_uri=<redirect_uri>&state=<state>",
|
|
// TokenURI: "https://open.tiktokapis.com/v2/oauth/token?",
|
|
// UserInfoURI: "https://open.tiktokapis.com/v2/user/info/?fields=open_id,union_id,avatar_url,display_name",
|
|
// })
|
|
clients.Ios = providers
|
|
providerStr, _ := json.Marshal(clients)
|
|
uMap := make(map[string]interface{})
|
|
uMap["client_id"] = utils.GetInvitationLen(18)
|
|
uMap["client_secret"] = utils.GetInvitationLen(50)
|
|
uMap["provider"] = string(providerStr)
|
|
global.MG_DB.Model(&model.Application{}).Where("appid=?", "appid").Updates(uMap)
|
|
|
|
}
|
|
|