github.com/resonatecoop/id@v1.1.0-43/oauth/grant_type_authorization_code.go (about) 1 package oauth 2 3 import ( 4 "context" 5 "errors" 6 "net/http" 7 8 "github.com/resonatecoop/id/oauth/tokentypes" 9 "github.com/resonatecoop/user-api/model" 10 ) 11 12 var ( 13 // ErrInvalidRedirectURI ... 14 ErrInvalidRedirectURI = errors.New("Invalid redirect URI") 15 ) 16 17 func (s *Service) authorizationCodeGrant(r *http.Request, client *model.Client) (*AccessTokenResponse, error) { 18 ctx := context.Background() 19 // Fetch the authorization code 20 authorizationCode, err := s.getValidAuthorizationCode( 21 r.Form.Get("code"), 22 r.Form.Get("redirect_uri"), 23 client, 24 ) 25 if err != nil { 26 return nil, err 27 } 28 29 // Log in the user 30 accessToken, refreshToken, err := s.Login( 31 authorizationCode.Client, 32 authorizationCode.User, 33 authorizationCode.Scope, 34 ) 35 if err != nil { 36 return nil, err 37 } 38 39 // Delete the authorization code 40 41 _, err = s.db.NewDelete(). 42 Model(authorizationCode). 43 WherePK(). 44 ForceDelete(). 45 Exec(ctx) 46 47 if err != nil { 48 return nil, err 49 } 50 51 // Create response 52 accessTokenResponse, err := NewAccessTokenResponse( 53 accessToken, 54 refreshToken, 55 s.cnf.Oauth.AccessTokenLifetime, 56 tokentypes.Bearer, 57 ) 58 if err != nil { 59 return nil, err 60 } 61 62 return accessTokenResponse, nil 63 }