A tool to migrate GitHub Repositories to Gitea including all issues
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.
 
 
 
 
gitea-github-migrator/web/auth/github.go

68 lines
1.9 KiB

package auth
import (
"context"
"net/http"
"git.jonasfranz.software/JonasFranzDEV/gitea-github-migrator/config"
webcontext "git.jonasfranz.software/JonasFranzDEV/gitea-github-migrator/web/context"
"github.com/adam-hanna/randomstrings"
"github.com/go-macaron/session"
"github.com/google/go-github/github"
"golang.org/x/oauth2"
githubauth "golang.org/x/oauth2/github"
)
var (
githubOAuthConfig *oauth2.Config
)
// InitGitHubOAuthConfig loads values from config into githubOAuthConfig
func InitGitHubOAuthConfig() {
githubOAuthConfig = &oauth2.Config{
ClientID: config.Config.GitHub.ClientID,
ClientSecret: config.Config.GitHub.ClientSecret,
Scopes: []string{"repo"},
Endpoint: githubauth.Endpoint,
}
}
// RedirectToGitHub returns the redirect URL for github
func RedirectToGitHub(ctx *webcontext.Context, session session.Store) {
state, err := randomstrings.GenerateRandomString(64)
if err != nil {
return
}
session.Set("state", state)
ctx.Redirect(githubOAuthConfig.AuthCodeURL(state), http.StatusTemporaryRedirect)
}
// CallbackFromGitHub handles the callback from the GitHub OAuth provider
func CallbackFromGitHub(ctx *webcontext.Context, session session.Store) {
bg := context.Background()
var state string
var ok bool
if state, ok = session.Get("state").(string); state == "" || !ok || state != ctx.Query("state") {
ctx.Handle(400, "invalid session", nil)
return
}
token, err := githubOAuthConfig.Exchange(bg, ctx.Query("code"))
if err != nil {
ctx.Handle(403, "access denied", err)
return
}
tc := oauth2.NewClient(bg, oauth2.StaticTokenSource(token))
client := github.NewClient(tc)
user, _, err := client.Users.Get(bg, "")
if err != nil {
ctx.Handle(403, "access denied", err)
return
}
session.Set("user", &webcontext.User{
ID: user.GetID(),
AvatarURL: *user.AvatarURL,
Username: user.GetLogin(),
Token: token.AccessToken,
})
ctx.Redirect("/")
}