Skip to content

Commit 0f24b8c

Browse files
authored
Improvements to get sso token flow after jwt bearer (#138)
1 parent 46e885e commit 0f24b8c

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

openid-client/openid-client.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ func main() {
189189
*clientID = uaaConfig.UAAOAuthClient
190190
*clientSecret = uaaConfig.UAAOAuthClientSecret
191191
}
192-
if *issEndPoint == "" {
192+
if *issEndPoint == "" && *urlEndPoint == "" {
193193
*issEndPoint = os.Getenv("OPENID_ISSUER")
194194
}
195195
if *clientID == "" {
@@ -207,7 +207,7 @@ func main() {
207207
if *tokenFormatParameter == "" {
208208
*tokenFormatParameter = os.Getenv("OPENID_FORMAT")
209209
}
210-
if *issEndPoint == "" {
210+
if *issEndPoint == "" && *urlEndPoint == "" {
211211
log.Fatal("issuer is required to run this command")
212212
} else if *clientID == "" {
213213
log.Fatal("client_id is required to run this command")
@@ -430,7 +430,7 @@ func main() {
430430
requestMap.Set("refresh_expiry", *refreshExpiry)
431431
}
432432
if *command == "client_credentials" {
433-
client.HandleClientCredential(requestMap, *bearerToken, *provider, *tlsClient, verbose)
433+
client.HandleClientCredential(requestMap, *bearerToken, claims.TokenEndPoint, *tlsClient, verbose)
434434
} else if *command == "password" {
435435
if *userName == "" {
436436
log.Fatal("username is required to run this command")
@@ -440,7 +440,7 @@ func main() {
440440
log.Fatal("password is required to run this command")
441441
}
442442
requestMap.Set("password", *userPassword)
443-
var responseToken = client.HandlePasswordGrant(requestMap, *provider, *tlsClient, verbose)
443+
var responseToken = client.HandlePasswordGrant(requestMap, claims.TokenEndPoint, *tlsClient, verbose)
444444
if *doCfCall {
445445
cf.WriteUaaConfig(*issEndPoint, responseToken)
446446
}
@@ -453,7 +453,7 @@ func main() {
453453
refreshToken = *assertionToken
454454
}
455455
var bSilent = (*resourceSso || *doRefresh) && !verbose
456-
var newRefresh = client.HandleRefreshFlow(verbose, bSilent, *clientID, *appTid, *clientSecret, refreshToken, *refreshExpiry, privateKeyJwt, *tlsClient, *provider)
456+
var newRefresh = client.HandleRefreshFlow(verbose, bSilent, *clientID, *appTid, *clientSecret, refreshToken, *refreshExpiry, privateKeyJwt, *tlsClient, claims.TokenEndPoint)
457457
if verbose {
458458
log.Println("Old refresh token: " + refreshToken)
459459
log.Println("New refresh token: " + newRefresh.RefreshToken)
@@ -501,6 +501,12 @@ func main() {
501501
}
502502
}
503503
} else if *command == "jwt-bearer" {
504+
if *resourceSso {
505+
requestMap.Del("resource")
506+
requestMap.Del("requested_token_type")
507+
requestMap.Set("refresh_expiry", "0")
508+
requestMap.Set("token_format", "opaque")
509+
}
504510
requestMap.Set("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer")
505511
if *assertionToken == "" {
506512
log.Fatal("assertion parameter not set. Needed to pass it for JWT bearer")
@@ -510,6 +516,19 @@ func main() {
510516
if *doCfCall {
511517
fmt.Println(jwtBearerTokenResponse.AccessToken)
512518
cf.WriteUaaConfig(*issEndPoint, jwtBearerTokenResponse)
519+
} else if *resourceSso && jwtBearerTokenResponse.AccessToken != "" {
520+
requestMap.Del("assertion")
521+
requestMap.Set("grant_type", "urn:ietf:params:oauth:grant-type:token-exchange")
522+
requestMap.Set("resource", "urn:sap:identity:sso")
523+
requestMap.Set("subject_token_type", "urn:ietf:params:oauth:token-type:access_token")
524+
requestMap.Set("requested_token_type", "urn:ietf:params:oauth:token-type:access_token")
525+
requestMap.Set("subject_token", jwtBearerTokenResponse.AccessToken)
526+
var exchangedTokenResponse = client.HandleTokenExchangeGrant(requestMap, claims.TokenEndPoint, *tlsClient, verbose)
527+
if exchangedTokenResponse.AccessToken != "" {
528+
fmt.Println(exchangedTokenResponse.AccessToken)
529+
} else {
530+
fmt.Println(exchangedTokenResponse.IdToken)
531+
}
513532
} else if jwtBearerTokenResponse.IdToken != "" {
514533
fmt.Println(jwtBearerTokenResponse.IdToken)
515534
} else {
@@ -588,7 +607,7 @@ func main() {
588607
log.Println("No refresh token received.")
589608
return
590609
}
591-
var newRefresh = client.HandleRefreshFlow(verbose, bSilent, *clientID, *appTid, *clientSecret, refreshToken, *refreshExpiry, privateKeyJwt, *tlsClient, *provider)
610+
var newRefresh = client.HandleRefreshFlow(verbose, bSilent, *clientID, *appTid, *clientSecret, refreshToken, *refreshExpiry, privateKeyJwt, *tlsClient, claims.TokenEndPoint)
592611
if verbose {
593612
log.Println("Old refresh token: " + refreshToken)
594613
log.Println("New refresh token: " + newRefresh.RefreshToken)

pkg/client/client.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ func HandleOpenIDFlow(request url.Values, verbose bool, bSilent bool, callbackUR
296296
return idToken, refreshToken
297297
}
298298

299-
func HandleRefreshFlow(verbose bool, bSilent bool, clientID string, appTid string, clientSecret string, existingRefresh string, refreshExpiry string, privateKeyJwt string, tlsClient http.Client, provider oidc.Provider) OpenIdToken {
299+
func HandleRefreshFlow(verbose bool, bSilent bool, clientID string, appTid string, clientSecret string, existingRefresh string, refreshExpiry string, privateKeyJwt string, tlsClient http.Client, tokenEndpointUrl string) OpenIdToken {
300300
var myToken OpenIdToken
301301
vals := url.Values{}
302302
vals.Set("grant_type", "refresh_token")
@@ -315,7 +315,7 @@ func HandleRefreshFlow(verbose bool, bSilent bool, clientID string, appTid strin
315315
vals.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer")
316316
vals.Set("client_assertion", privateKeyJwt)
317317
}
318-
req, requestError := http.NewRequest("POST", provider.Endpoint().TokenURL, strings.NewReader(vals.Encode()))
318+
req, requestError := http.NewRequest("POST", tokenEndpointUrl, strings.NewReader(vals.Encode()))
319319
if requestError != nil {
320320
log.Fatal(requestError)
321321
}
@@ -348,10 +348,10 @@ func HandleRefreshFlow(verbose bool, bSilent bool, clientID string, appTid strin
348348
return myToken
349349
}
350350

351-
func HandleClientCredential(request url.Values, bearerToken string, provider oidc.Provider, tlsClient http.Client, verbose bool) string {
351+
func HandleClientCredential(request url.Values, bearerToken string, tokenEndpointUrl string, tlsClient http.Client, verbose bool) string {
352352
refreshToken := ""
353353
request.Set("grant_type", "client_credentials")
354-
req, requestError := http.NewRequest("POST", provider.Endpoint().TokenURL, strings.NewReader(request.Encode()))
354+
req, requestError := http.NewRequest("POST", tokenEndpointUrl, strings.NewReader(request.Encode()))
355355
if requestError != nil {
356356
log.Fatal(requestError)
357357
}
@@ -391,10 +391,10 @@ func HandleClientCredential(request url.Values, bearerToken string, provider oid
391391
return refreshToken
392392
}
393393

394-
func HandlePasswordGrant(request url.Values, provider oidc.Provider, tlsClient http.Client, verbose bool) OpenIdToken {
394+
func HandlePasswordGrant(request url.Values, tokenEndpointUrl string, tlsClient http.Client, verbose bool) OpenIdToken {
395395
var oidctoken OpenIdToken
396396
request.Set("grant_type", "password")
397-
req, requestError := http.NewRequest("POST", provider.Endpoint().TokenURL, strings.NewReader(request.Encode()))
397+
req, requestError := http.NewRequest("POST", tokenEndpointUrl, strings.NewReader(request.Encode()))
398398
if requestError != nil {
399399
log.Fatal(requestError)
400400
}
@@ -418,10 +418,15 @@ func HandlePasswordGrant(request url.Values, provider oidc.Provider, tlsClient h
418418
fmt.Println(string(jsonStr))
419419
} else {
420420
if verbose {
421+
fmt.Println("ID Token: " + myToken.IdToken)
421422
fmt.Println("Access Token: " + myToken.AccessToken)
422423
fmt.Println("Refresh Token: " + myToken.RefreshToken)
423424
} else {
424-
fmt.Println(myToken.AccessToken)
425+
if myToken.IdToken != "" {
426+
fmt.Println(myToken.IdToken)
427+
} else {
428+
fmt.Println(myToken.AccessToken)
429+
}
425430
}
426431
oidctoken = myToken
427432
}

0 commit comments

Comments
 (0)