A sample library thatprovides HTTP
and gRPC
credentials where the final access_token
is acquired through STS OAuth 2.0 Token Exchange: rfc8693
You can use this library for use in any net/http
Client for REST calls or gRPC RPC RPCCredentials
where you exchange an intermediate credential with an STS server for a final access_token
. The final token is then used to access the resource server
see examples/
folder
NOTE: the code in this repo is not supported by google.
You can find the source here
this repo is not supported by google
import (
stshttp "github.com/salrashid123/sts/http"
)
rootTS := oauth2.StaticTokenSource(&oauth2.Token{
AccessToken: secret,
TokenType: "Bearer",
Expiry: time.Now().Add(time.Duration(time.Second * 60)),
})
// HTTP
stsTokenSource, _ := stshttp.STSTokenSource(
&stshttp.STSTokenConfig{
TokenExchangeServiceURI: *stsaddress,
Resource: *stsaudience,
Audience: *stsaudience,
Scope: *scope,
SubjectTokenSource: rootTS,
SubjectTokenType: "urn:ietf:params:oauth:token-type:access_token",
RequestedTokenType: "urn:ietf:params:oauth:token-type:access_token",
HTTPClient: http.DefaultClient,
},
)
tok, err := stsTokenSource.Token()
log.Printf("New Token: %s", tok.AccessToken)
client := oauth2.NewClient(context.TODO(), stsTokenSource)
resp, err := client.Get(*httpAddress)
Note that upstream google.golang.org/grpc/credentials/sts provides the same credential object except that this variation allows for
arbitrary HTTPClients issue #5611
allowing source tokens from arbitrary oauth2.TokenSource
:
// token source for the subject token
SubjectTokenSource *oauth2.TokenSource
Example usage:
import (
stsgrpc "github.com/salrashid123/sts/grpc"
)
rootTS := oauth2.StaticTokenSource(&oauth2.Token{
AccessToken: secret,
TokenType: "Bearer",
Expiry: time.Now().Add(time.Duration(time.Second * 60)),
})
ce := credentials.NewTLS(&tls.Config{})
// ### test with sts
stscreds, err := stsgrpc.NewCredentials(stsgrpc.Options{
TokenExchangeServiceURI: *stsaddress,
Resource: *stsaudience,
Audience: *stsaudience,
Scope: *scope,
SubjectTokenSource: &rootTS,
SubjectTokenType: "urn:ietf:params:oauth:token-type:access_token",
RequestedTokenType: "urn:ietf:params:oauth:token-type:access_token",
HTTPClient: http.DefaultClient,
})
ctx := context.Background()
conn, err := grpc.Dial(*grpcAddress,
grpc.WithTransportCredentials(ce),
grpc.WithPerRPCCredentials(stscreds))
defer conn.Close()
c := pb.NewEchoServerClient(conn)
r, err := c.SayHello(ctx, &pb.EchoRequest{Name: "unary RPC msg "})
This site supports webmentions. Send me a mention via this form.