Skip to content

Commit

Permalink
Merge pull request #405 from MadAppGang/fix/payload-for-refresh-token
Browse files Browse the repository at this point in the history
add token payload for refreshed token
  • Loading branch information
hummerdmag committed Jun 10, 2023
2 parents 63b85ab + 6bec938 commit d2e154d
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 10 deletions.
9 changes: 7 additions & 2 deletions jwt/service/jwt_token_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ func (ts *JWTokenService) NewRefreshToken(u model.User, scopes []string, app mod
}

// RefreshAccessToken issues new access token for provided refresh token.
func (ts *JWTokenService) RefreshAccessToken(refreshToken model.Token) (model.Token, error) {
func (ts *JWTokenService) RefreshAccessToken(refreshToken model.Token, tokenPayload map[string]interface{}) (model.Token, error) {
rt, ok := refreshToken.(*model.JWToken)
if !ok || rt == nil {
return nil, model.ErrTokenInvalid
Expand All @@ -343,7 +343,12 @@ func (ts *JWTokenService) RefreshAccessToken(refreshToken model.Token) (model.To
return nil, ErrInvalidUser
}

token, err := ts.NewAccessToken(user, strings.Split(claims.Scopes, " "), app, false, nil)
token, err := ts.NewAccessToken(
user,
strings.Split(claims.Scopes, " "),
app,
false,
tokenPayload)
if err != nil {
return nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion model/token_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const (
type TokenService interface {
NewAccessToken(u User, scopes []string, app AppData, requireTFA bool, tokenPayload map[string]interface{}) (Token, error)
NewRefreshToken(u User, scopes []string, app AppData) (Token, error)
RefreshAccessToken(token Token) (Token, error)
RefreshAccessToken(token Token, tokenPayload map[string]interface{}) (Token, error)
NewInviteToken(email, role, audience string, data map[string]interface{}) (Token, error)
NewResetToken(userID string) (Token, error)
NewWebCookieToken(u User) (Token, error)
Expand Down
4 changes: 2 additions & 2 deletions web/api/2fa.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ func (ar *Router) EnableTFA() http.HandlerFunc {
return
}

tokenPayload, err := ar.getTokenPayloadForApp(app, user)
tokenPayload, err := ar.getTokenPayloadForApp(app, user.ID)
if err != nil {
ar.Error(w, locale, http.StatusInternalServerError, l.ErrorAPIAPPUnableToTokenPayloadForAPPError, app.ID, err)
return
Expand Down Expand Up @@ -276,7 +276,7 @@ func (ar *Router) FinalizeTFA() http.HandlerFunc {
scopes = append(scopes, "offline")
}

tokenPayload, err := ar.getTokenPayloadForApp(app, user)
tokenPayload, err := ar.getTokenPayloadForApp(app, user.ID)
if err != nil {
ar.Error(w, locale, http.StatusInternalServerError, l.ErrorAPIAPPUnableToTokenPayloadForAPPError, app.ID, err)
return
Expand Down
6 changes: 3 additions & 3 deletions web/api/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ func (ar *Router) GetUser() http.HandlerFunc {
}

// getTokenPayloadForApp get additional token payload data
func (ar *Router) getTokenPayloadForApp(app model.AppData, user model.User) (map[string]interface{}, error) {
func (ar *Router) getTokenPayloadForApp(app model.AppData, userID string) (map[string]interface{}, error) {
if app.TokenPayloadService == model.TokenPayloadServiceNone ||
app.TokenPayloadService == "" {
return nil, nil
Expand All @@ -246,7 +246,7 @@ func (ar *Router) getTokenPayloadForApp(app model.AppData, user model.User) (map
return nil, err
}

return ps.TokenPayloadForApp(app.ID, app.Name, user.ID)
return ps.TokenPayloadForApp(app.ID, app.Name, userID)
}

func (ar *Router) getTokenPayloadService(app model.AppData) (model.TokenPayloadProvider, error) {
Expand Down Expand Up @@ -346,7 +346,7 @@ func (ar *Router) loginFlow(app model.AppData, user model.User, requestedScopes
}

offline := contains(scopes, model.OfflineScope)
tokenPayload, err := ar.getTokenPayloadForApp(app, user)
tokenPayload, err := ar.getTokenPayloadForApp(app, user.ID)
if err != nil {
return AuthResponse{}, err
}
Expand Down
2 changes: 1 addition & 1 deletion web/api/phone_login.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ func (ar *Router) PhoneLogin() http.HandlerFunc {
scopes = append(scopes, "offline")
}

tokenPayload, err := ar.getTokenPayloadForApp(app, user)
tokenPayload, err := ar.getTokenPayloadForApp(app, user.ID)
if err != nil {
ar.Error(w, locale, http.StatusInternalServerError, l.ErrorAPIAPPUnableToTokenPayloadForAPPError, app.ID, err)
return
Expand Down
13 changes: 12 additions & 1 deletion web/api/refresh_token.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,19 @@ func (ar *Router) RefreshTokens() http.HandlerFunc {
// Get refresh token from context.
oldRefreshToken := tokenFromContext(r.Context())

if err := oldRefreshToken.Validate(); err != nil {
ar.Error(w, locale, http.StatusUnauthorized, l.ErrorTokenInvalidError, err)
return
}

tokenPayload, err := ar.getTokenPayloadForApp(app, oldRefreshToken.Subject())
if err != nil {
ar.Error(w, locale, http.StatusBadRequest, l.ErrorAPIAPPUnableToTokenPayloadForAPPError)
return
}

// Issue new access token and stringify it for response.
accessToken, err := ar.server.Services().Token.RefreshAccessToken(oldRefreshToken)
accessToken, err := ar.server.Services().Token.RefreshAccessToken(oldRefreshToken, tokenPayload)
if err != nil {
ar.Error(w, locale, http.StatusInternalServerError, l.ErrorTokenRefreshAccessToken, err)
return
Expand Down

0 comments on commit d2e154d

Please sign in to comment.