101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
package auth
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/gin-gonic/gin"
|
|
"net/http"
|
|
"os"
|
|
"ripper/internal/app/github_auth"
|
|
"ripper/internal/cache"
|
|
"ripper/internal/middleware"
|
|
"ripper/internal/response"
|
|
jwtpkg "ripper/pkg/jwt"
|
|
"time"
|
|
)
|
|
|
|
type getLoginOauthAuthorizeRequest struct {
|
|
ClientId string `json:"client_id" form:"client_id"`
|
|
Prompt string `json:"prompt" form:"prompt"`
|
|
RedirectUri string `json:"redirect_uri" form:"redirect_uri"`
|
|
Scope string `json:"scope" form:"scope"`
|
|
State string `json:"state" form:"state"`
|
|
}
|
|
|
|
func getLoginOauthAuthorize(ctx *gin.Context) {
|
|
req := getLoginOauthAuthorizeRequest{}
|
|
err := ctx.BindQuery(&req)
|
|
if err != nil {
|
|
response.FailJson(ctx, response.FailStruct{
|
|
Code: -1,
|
|
Msg: "Invalid request.",
|
|
}, false)
|
|
return
|
|
}
|
|
|
|
vsCopilotClientId := os.Getenv("VS_COPILOT_CLIENT_ID")
|
|
if req.ClientId != vsCopilotClientId {
|
|
response.FailJson(ctx, response.FailStruct{
|
|
Code: -1,
|
|
Msg: "Invalid client id.",
|
|
}, false)
|
|
return
|
|
}
|
|
|
|
oauthCode := github_auth.GenDevicesCode(20)
|
|
cai := github_auth.ClientOAuthInfo{
|
|
ClientId: req.ClientId,
|
|
Code: oauthCode,
|
|
Scope: req.Scope,
|
|
}
|
|
cacheKey := "oauth2_authorize_" + req.ClientId
|
|
caiInfo, _ := json.Marshal(cai)
|
|
err = cache.Set(cacheKey, caiInfo, 300)
|
|
if err != nil {
|
|
response.FailJson(ctx, response.FailStruct{
|
|
Code: -1,
|
|
Msg: "Internal error.",
|
|
}, false)
|
|
return
|
|
}
|
|
|
|
// Redirect to the client's redirect_uri
|
|
browserSessionId := github_auth.GenDevicesCode(64)
|
|
ctx.Redirect(302, req.RedirectUri+"?browserSessionId="+browserSessionId+"&code="+oauthCode+"&state="+req.State)
|
|
}
|
|
|
|
func postLoginOauthAccessTokenForVs2022(ctx *gin.Context) {
|
|
v, exists := ctx.Get("client_auth_info")
|
|
if !exists {
|
|
response.FailJson(ctx, response.FailStruct{
|
|
Code: -1,
|
|
Msg: "Invalid client id.",
|
|
}, false)
|
|
return
|
|
}
|
|
cliAuthInfo := v.(*github_auth.ClientOAuthInfo)
|
|
t := time.Now()
|
|
t.Add(24 * 3 * time.Hour)
|
|
tk, _ := jwtpkg.CreateToken(&middleware.UserLoad{
|
|
CardCode: cliAuthInfo.Code,
|
|
Client: cliAuthInfo.ClientId,
|
|
RegisteredClaims: jwtpkg.CreateStandardClaims(t.Unix(), "user"),
|
|
})
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"access_token": tk,
|
|
"scope": cliAuthInfo.Scope,
|
|
"token_type": "bearer",
|
|
})
|
|
}
|
|
|
|
func getSiteSha(ctx *gin.Context) {
|
|
ctx.Header("X-GitHub-Request-Id", "C0E1:6A1A:1A1F:2A1D:1A1F:1A1F:1A1F:1A1F")
|
|
ctx.JSON(http.StatusOK, gin.H{})
|
|
}
|
|
|
|
func getLoginConfig(ctx *gin.Context) {
|
|
loginPassword := os.Getenv("LOGIN_PASSWORD")
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"is_login_password": loginPassword != "",
|
|
})
|
|
}
|