import (
"crypto/rand"
"crypto/sha256"
"encoding/base64"
)
func generatePKCE() (verifier, challenge string, err error) {
// Generate code verifier
b := make([]byte, 32)
if _, err := rand.Read(b); err != nil {
return "", "", err
}
verifier = base64.RawURLEncoding.EncodeToString(b)
// Generate code challenge
h := sha256.New()
h.Write([]byte(verifier))
challenge = base64.RawURLEncoding.EncodeToString(h.Sum(nil))
return verifier, challenge, nil
}
func main() {
client := aries.NewClient(
aries.WithClientID("your_client_id"),
aries.WithClientSecret("your_client_secret"),
)
// Generate PKCE parameters
verifier, challenge, err := generatePKCE()
if err != nil {
log.Fatal(err)
}
// Step 1: Authorization with PKCE
authURL, err := client.OAuth2.GetAuthorizationURL(&aries.AuthURLParams{
RedirectURI: "https://yourapp.com/callback",
CodeChallenge: challenge,
CodeChallengeMethod: "S256",
})
if err != nil {
log.Fatal(err)
}
// Step 2: Exchange code with verifier
tokens, err := client.OAuth2.ExchangeCode(&aries.TokenExchangeParams{
Code: authCode,
RedirectURI: "https://yourapp.com/callback",
CodeVerifier: verifier,
})
if err != nil {
log.Fatal(err)
}
}