Function to validate refreshToken
(gc *gin.Context, refreshToken string)
| 332 | |
| 333 | // Function to validate refreshToken |
| 334 | func (p *provider) ValidateRefreshToken(gc *gin.Context, refreshToken string) (map[string]interface{}, error) { |
| 335 | res := make(map[string]interface{}) |
| 336 | |
| 337 | if refreshToken == "" { |
| 338 | return res, fmt.Errorf(`unauthorized`) |
| 339 | } |
| 340 | |
| 341 | res, err := p.ParseJWTToken(refreshToken) |
| 342 | if err != nil { |
| 343 | return res, err |
| 344 | } |
| 345 | |
| 346 | userID, ok := res["sub"].(string) |
| 347 | if !ok || userID == "" { |
| 348 | return res, fmt.Errorf(`unauthorized: missing sub claim`) |
| 349 | } |
| 350 | nonce, _ := res["nonce"].(string) |
| 351 | |
| 352 | loginMethod, _ := res["login_method"].(string) |
| 353 | sessionKey := userID |
| 354 | if loginMethod != "" { |
| 355 | sessionKey = loginMethod + ":" + userID |
| 356 | } |
| 357 | token, err := p.dependencies.MemoryStoreProvider.GetUserSession(sessionKey, constants.TokenTypeRefreshToken+"_"+nonce) |
| 358 | if nonce == "" || err != nil { |
| 359 | p.dependencies.Log.Debug().Err(err).Msgf("invalid refresh token: %v, key: %s", err, sessionKey+":"+constants.TokenTypeRefreshToken+"_"+nonce) |
| 360 | return res, fmt.Errorf(`unauthorized`) |
| 361 | } |
| 362 | |
| 363 | if subtle.ConstantTimeCompare([]byte(token), []byte(refreshToken)) != 1 { |
| 364 | p.dependencies.Log.Debug().Msgf("invalid refresh token: %s, key: %s", err, sessionKey+":"+constants.TokenTypeRefreshToken+"_"+nonce) |
| 365 | return res, fmt.Errorf(`unauthorized`) |
| 366 | } |
| 367 | |
| 368 | hostname := parsers.GetHost(gc) |
| 369 | if ok, err := p.ValidateJWTClaims(res, &AuthTokenConfig{ |
| 370 | HostName: hostname, |
| 371 | Nonce: nonce, |
| 372 | User: &schemas.User{ID: userID}, |
| 373 | }); !ok || err != nil { |
| 374 | return res, err |
| 375 | } |
| 376 | |
| 377 | if res["token_type"] != constants.TokenTypeRefreshToken { |
| 378 | return res, fmt.Errorf(`unauthorized: invalid token type`) |
| 379 | } |
| 380 | |
| 381 | return res, nil |
| 382 | } |
| 383 | |
| 384 | func (p *provider) ValidateBrowserSession(gc *gin.Context, encryptedSession string) (*SessionData, error) { |
| 385 | if encryptedSession == "" { |
nothing calls this directly
no test coverage detected