Skip to content

Commit 73f4132

Browse files
committed
add custom identity provider example
1 parent 79822ea commit 73f4132

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

examples/custom_idp/go.mod

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
module custom_example
2+
3+
go 1.23.4
4+
5+
require (
6+
github.com/redis-developer/go-redis-entraid v0.0.0-20250415111332-9d087bc29c12
7+
github.com/redis/go-redis/v9 v9.5.3-0.20250415103233-40a89c56cc52
8+
)
9+
10+
require (
11+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
12+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0-beta.1 // indirect
13+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
14+
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.1 // indirect
15+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
16+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
17+
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
18+
github.com/google/uuid v1.6.0 // indirect
19+
github.com/kylelemons/godebug v1.1.0 // indirect
20+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
21+
golang.org/x/crypto v0.33.0 // indirect
22+
golang.org/x/net v0.35.0 // indirect
23+
golang.org/x/sys v0.30.0 // indirect
24+
golang.org/x/text v0.22.0 // indirect
25+
)

examples/custom_idp/go.sum

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ=
2+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ=
3+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0-beta.1 h1:iw4+KCeCoieuKodp1d5YhAa1TU/GgogCbw8RbGvsfLA=
4+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0-beta.1/go.mod h1:AP8cDnDTGIVvayqKAhwzpcAyTJosXpvLYNmVFJb98x8=
5+
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.2.3 h1:BAUsn6/icUFtvUalVwCO0+hSF7qgU9DwwcEfCvtILtw=
6+
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.2.3/go.mod h1:QlAsNp4gk9zLD2wiZIvIuv699ynpZ2Tq2ZBp+6MrSEw=
7+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
8+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
9+
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
10+
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
11+
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.1 h1:8BKxhZZLX/WosEeoCvWysmKUscfa9v8LIPEEU0JjE2o=
12+
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
13+
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
14+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
15+
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
16+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
17+
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
18+
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
19+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
20+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
21+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
22+
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
23+
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
24+
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
25+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
26+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
27+
github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs=
28+
github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw=
29+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
30+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
31+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
32+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
33+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
34+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
35+
github.com/redis-developer/go-redis-entraid v0.0.0-20250415111332-9d087bc29c12 h1:H5ZfgueBAxs2eAvXtCMEbT2/fLQz/wxW5Ds4c0uzl50=
36+
github.com/redis-developer/go-redis-entraid v0.0.0-20250415111332-9d087bc29c12/go.mod h1:uXKLxCMUAu1VKgWdt8gWc4PWCygiL2pAI5XpnRSVc0w=
37+
github.com/redis/go-redis/v9 v9.5.3-0.20250415103233-40a89c56cc52 h1:jRx2gINoJsGKxi/RYXCq1VneAAYes9JxUp13xH2oU2g=
38+
github.com/redis/go-redis/v9 v9.5.3-0.20250415103233-40a89c56cc52/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
39+
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
40+
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
41+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
42+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
43+
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
44+
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
45+
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
46+
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
47+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
48+
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
49+
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
50+
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
51+
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
52+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
53+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

examples/custom_idp/main.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strconv"
7+
"strings"
8+
"time"
9+
10+
entraid "github.com/redis-developer/go-redis-entraid"
11+
"github.com/redis-developer/go-redis-entraid/manager"
12+
"github.com/redis-developer/go-redis-entraid/shared"
13+
"github.com/redis-developer/go-redis-entraid/token"
14+
redis "github.com/redis/go-redis/v9"
15+
)
16+
17+
func main() {
18+
ctx := context.Background()
19+
idp := NewFakeIdentityProvider("local", "pass")
20+
parser := &fakeIdentityProviderResponseParser{}
21+
// create token manager
22+
23+
tm, err := manager.NewTokenManager(idp, manager.TokenManagerOptions{
24+
IdentityProviderResponseParser: parser,
25+
})
26+
27+
cp, err := entraid.NewCredentialsProvider(tm, entraid.CredentialsProviderOptions{})
28+
if err != nil {
29+
panic(err)
30+
}
31+
32+
redis := redis.NewClient(&redis.Options{
33+
Addr: ":6379",
34+
StreamingCredentialsProvider: cp,
35+
})
36+
37+
ok, err := redis.Ping(ctx).Result()
38+
if err != nil {
39+
panic(err)
40+
}
41+
fmt.Println("Ping result:", ok)
42+
}
43+
44+
var _ entraid.IdentityProvider = (*FakeIdentityProvider)(nil)
45+
46+
type FakeIdentityProvider struct {
47+
username string
48+
password string
49+
}
50+
51+
// RequestToken simulates a request to an identity provider and returns a fake token.
52+
// In a real implementation, this would involve making a network request to the identity provider.
53+
func (f *FakeIdentityProvider) RequestToken() (entraid.IdentityProviderResponse, error) {
54+
// Simulate a successful token request
55+
return shared.NewIDPResponse(
56+
shared.ResponseTypeRawToken,
57+
fmt.Sprintf("%s:%s:%d", f.username, f.password, time.Now().Add(1*time.Hour).Unix()),
58+
)
59+
}
60+
61+
// NewFakeIdentityProvider creates a new instance of FakeIdentityProvider with the given username and password.
62+
func NewFakeIdentityProvider(username, password string) *FakeIdentityProvider {
63+
return &FakeIdentityProvider{
64+
username: username,
65+
password: password,
66+
}
67+
}
68+
69+
type fakeIdentityProviderResponseParser struct {
70+
}
71+
72+
// ParseResponse simulates the parsing of a response from an identity provider.
73+
func (f *fakeIdentityProviderResponseParser) ParseResponse(response entraid.IdentityProviderResponse) (*token.Token, error) {
74+
if response.Type() == shared.ResponseTypeRawToken {
75+
rawToken := response.RawToken()
76+
username, password := "", ""
77+
var expiresOnUnix int64
78+
79+
// parse the raw token string
80+
// assuming the format is "username:password:expiresOnUnix"
81+
// where expiresOnUnix is a unix timestamp
82+
parts := strings.Split(rawToken, ":")
83+
if len(parts) != 3 {
84+
return nil, fmt.Errorf("invalid raw token format")
85+
}
86+
username = parts[0]
87+
password = parts[1]
88+
expiresOnUnix, err := strconv.ParseInt(parts[2], 10, 64)
89+
if err != nil {
90+
return nil, fmt.Errorf("failed to parse raw token: %w", err)
91+
}
92+
93+
// convert the unix timestamp to time.Time
94+
expiresOn := time.Unix(expiresOnUnix, 0)
95+
now := time.Now()
96+
return token.New(username, password, rawToken, expiresOn, now, int64(expiresOn.Sub(now).Seconds())), nil
97+
}
98+
return nil, fmt.Errorf("unsupported response type: %s", response.Type())
99+
}
100+
101+
var _ entraid.IdentityProviderResponseParser = (*fakeIdentityProviderResponseParser)(nil)

0 commit comments

Comments
 (0)