61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
package git
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/go-git/go-git/v5/plumbing/transport"
|
|
"github.com/go-git/go-git/v5/plumbing/transport/http"
|
|
"github.com/go-git/go-git/v5/plumbing/transport/ssh"
|
|
)
|
|
|
|
// AuthConfig 描述 Git 鉴权方式。
|
|
type AuthConfig struct {
|
|
Method string
|
|
Username string
|
|
Password string
|
|
Token string
|
|
SSHKeyPath string
|
|
SSHKeyPassword string
|
|
}
|
|
|
|
const (
|
|
// AuthMethodToken 使用 Token 鉴权。
|
|
AuthMethodToken = "token"
|
|
// AuthMethodSSHKey 使用 SSH Key 鉴权。
|
|
AuthMethodSSHKey = "ssh_key"
|
|
// AuthMethodUserPass 使用用户名密码鉴权。
|
|
AuthMethodUserPass = "user_pass"
|
|
)
|
|
|
|
// authMethod 根据配置构造 go-git 鉴权实例。
|
|
func authMethod(config AuthConfig) (transport.AuthMethod, error) {
|
|
switch config.Method {
|
|
case AuthMethodToken:
|
|
if config.Token == "" {
|
|
return nil, errors.New("git token is required")
|
|
}
|
|
return &http.BasicAuth{
|
|
Username: "git",
|
|
Password: config.Token,
|
|
}, nil
|
|
case AuthMethodUserPass:
|
|
if config.Username == "" || config.Password == "" {
|
|
return nil, errors.New("git username and password are required")
|
|
}
|
|
return &http.BasicAuth{
|
|
Username: config.Username,
|
|
Password: config.Password,
|
|
}, nil
|
|
case AuthMethodSSHKey:
|
|
if config.SSHKeyPath == "" {
|
|
return nil, errors.New("git ssh key path is required")
|
|
}
|
|
return ssh.NewPublicKeysFromFile("git", config.SSHKeyPath, config.SSHKeyPassword)
|
|
case "":
|
|
return nil, nil
|
|
default:
|
|
return nil, fmt.Errorf("unsupported git auth method: %s", config.Method)
|
|
}
|
|
}
|