Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions internal/auth/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,10 @@ func openBrowser(url string) error {
return cmd.Start()
}

func callbackRedirectURI(addr net.Addr) string {
return fmt.Sprintf("http://%s/callback", addr.String())
}

// Login runs the full OAuth2 Authorization Code + PKCE flow.
// Returns a credential to store.
func Login(server string) (*config.Credential, error) {
Expand All @@ -274,8 +278,7 @@ func Login(server string) (*config.Credential, error) {
if err != nil {
return nil, err
}
port := listener.Addr().(*net.TCPAddr).Port
redirectURI := fmt.Sprintf("http://localhost:%d/callback", port)
redirectURI := callbackRedirectURI(listener.Addr())

// Register client
clientInfo, err := registerClient(regEndpoint, redirectURI)
Expand Down
27 changes: 27 additions & 0 deletions internal/auth/auth_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,40 @@ package auth
import (
"crypto/rand"
"crypto/rsa"
"net"
"net/url"
"strconv"
"testing"
"time"

"github.com/go-jose/go-jose/v4"
"github.com/go-jose/go-jose/v4/jwt"
)

func TestCallbackRedirectURIMatchesLoopbackListener(t *testing.T) {
listener, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
_ = listener.Close()
})

redirect, err := url.Parse(callbackRedirectURI(listener.Addr()))
if err != nil {
t.Fatal(err)
}
if redirect.Hostname() != "127.0.0.1" {
t.Fatalf("redirect hostname = %q, want 127.0.0.1", redirect.Hostname())
}
if redirect.Port() != strconv.Itoa(listener.Addr().(*net.TCPAddr).Port) {
t.Fatalf("redirect port = %q, listener = %q", redirect.Port(), listener.Addr())
}
if redirect.Path != "/callback" {
t.Fatalf("redirect path = %q, want /callback", redirect.Path)
}
}

func TestVerifiedTokenToCredentialUsesFallbacks(t *testing.T) {
vt := &VerifiedToken{
AccessToken: "access",
Expand Down
Loading