diff --git a/.schema/api.swagger.json b/.schema/api.swagger.json index 440787ed5a4..a4388aa6ff8 100755 --- a/.schema/api.swagger.json +++ b/.schema/api.swagger.json @@ -1184,9 +1184,9 @@ ], "responses": { "200": { - "description": "sessionTokenContainer", + "description": "loginViaApiResponse", "schema": { - "$ref": "#/definitions/sessionTokenContainer" + "$ref": "#/definitions/loginViaApiResponse" } }, "302": { @@ -1891,6 +1891,23 @@ } } }, + "loginViaApiResponse": { + "description": "The Response for Login Flows via API", + "type": "object", + "required": [ + "session_token", + "session" + ], + "properties": { + "session": { + "$ref": "#/definitions/session" + }, + "session_token": { + "description": "The Session Token\n\nA session token is equivalent to a session cookie, but it can be sent in the HTTP Authorization\nHeader:\n\nAuthorization: bearer \u003csession-token\u003e\n\nThe session token is only issued for API flows, not for Browser flows!", + "type": "string" + } + } + }, "recoveryRequest": { "description": "This request is used when an identity wants to recover their account.\n\nWe recommend reading the [Account Recovery Documentation](../self-service/flows/password-reset-account-recovery)", "type": "object", @@ -2072,23 +2089,6 @@ } } }, - "sessionTokenContainer": { - "description": "Contains the Session and Session Token for API Based Authentication", - "type": "object", - "required": [ - "session_token", - "session" - ], - "properties": { - "session": { - "$ref": "#/definitions/session" - }, - "session_token": { - "description": "The Session Token\n\nA session token is equivalent to a session cookie, but it can be sent in the HTTP Authorization\nHeader:\n\nAuthorization: bearer \u003csession-token\u003e\n\nThe session token is only issued for API flows, not for Browser flows!", - "type": "string" - } - } - }, "settingsRequest": { "description": "This request is used when an identity wants to update settings\n(e.g. profile data, passwords, ...) in a selfservice manner.\n\nWe recommend reading the [User Settings Documentation](../self-service/flows/user-settings)", "type": "object", @@ -2139,6 +2139,9 @@ }, "state": { "$ref": "#/definitions/State" + }, + "type": { + "$ref": "#/definitions/Type" } } }, @@ -2210,4 +2213,4 @@ }, "x-forwarded-proto": "string", "x-request-id": "string" -} \ No newline at end of file +} diff --git a/internal/httpclient/client/public/complete_self_service_login_flow_with_password_method_responses.go b/internal/httpclient/client/public/complete_self_service_login_flow_with_password_method_responses.go index 3a010055cdd..f03da93e36a 100644 --- a/internal/httpclient/client/public/complete_self_service_login_flow_with_password_method_responses.go +++ b/internal/httpclient/client/public/complete_self_service_login_flow_with_password_method_responses.go @@ -60,23 +60,23 @@ func NewCompleteSelfServiceLoginFlowWithPasswordMethodOK() *CompleteSelfServiceL /*CompleteSelfServiceLoginFlowWithPasswordMethodOK handles this case with default header values. -sessionTokenContainer +loginViaApiResponse */ type CompleteSelfServiceLoginFlowWithPasswordMethodOK struct { - Payload *models.SessionTokenContainer + Payload *models.LoginViaAPIResponse } func (o *CompleteSelfServiceLoginFlowWithPasswordMethodOK) Error() string { return fmt.Sprintf("[GET /self-service/login/methods/password][%d] completeSelfServiceLoginFlowWithPasswordMethodOK %+v", 200, o.Payload) } -func (o *CompleteSelfServiceLoginFlowWithPasswordMethodOK) GetPayload() *models.SessionTokenContainer { +func (o *CompleteSelfServiceLoginFlowWithPasswordMethodOK) GetPayload() *models.LoginViaAPIResponse { return o.Payload } func (o *CompleteSelfServiceLoginFlowWithPasswordMethodOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { - o.Payload = new(models.SessionTokenContainer) + o.Payload = new(models.LoginViaAPIResponse) // response payload if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { diff --git a/internal/httpclient/models/session_token_container.go b/internal/httpclient/models/login_via_api_response.go similarity index 72% rename from internal/httpclient/models/session_token_container.go rename to internal/httpclient/models/login_via_api_response.go index f4b1e9a4e62..eced67ecddf 100644 --- a/internal/httpclient/models/session_token_container.go +++ b/internal/httpclient/models/login_via_api_response.go @@ -12,10 +12,10 @@ import ( "github.com/go-openapi/validate" ) -// SessionTokenContainer Contains the Session and Session Token for API Based Authentication +// LoginViaAPIResponse The Response for Login Flows via API // -// swagger:model sessionTokenContainer -type SessionTokenContainer struct { +// swagger:model loginViaApiResponse +type LoginViaAPIResponse struct { // session // Required: true @@ -33,8 +33,8 @@ type SessionTokenContainer struct { SessionToken *string `json:"session_token"` } -// Validate validates this session token container -func (m *SessionTokenContainer) Validate(formats strfmt.Registry) error { +// Validate validates this login via Api response +func (m *LoginViaAPIResponse) Validate(formats strfmt.Registry) error { var res []error if err := m.validateSession(formats); err != nil { @@ -51,7 +51,7 @@ func (m *SessionTokenContainer) Validate(formats strfmt.Registry) error { return nil } -func (m *SessionTokenContainer) validateSession(formats strfmt.Registry) error { +func (m *LoginViaAPIResponse) validateSession(formats strfmt.Registry) error { if err := validate.Required("session", "body", m.Session); err != nil { return err @@ -69,7 +69,7 @@ func (m *SessionTokenContainer) validateSession(formats strfmt.Registry) error { return nil } -func (m *SessionTokenContainer) validateSessionToken(formats strfmt.Registry) error { +func (m *LoginViaAPIResponse) validateSessionToken(formats strfmt.Registry) error { if err := validate.Required("session_token", "body", m.SessionToken); err != nil { return err @@ -79,7 +79,7 @@ func (m *SessionTokenContainer) validateSessionToken(formats strfmt.Registry) er } // MarshalBinary interface implementation -func (m *SessionTokenContainer) MarshalBinary() ([]byte, error) { +func (m *LoginViaAPIResponse) MarshalBinary() ([]byte, error) { if m == nil { return nil, nil } @@ -87,8 +87,8 @@ func (m *SessionTokenContainer) MarshalBinary() ([]byte, error) { } // UnmarshalBinary interface implementation -func (m *SessionTokenContainer) UnmarshalBinary(b []byte) error { - var res SessionTokenContainer +func (m *LoginViaAPIResponse) UnmarshalBinary(b []byte) error { + var res LoginViaAPIResponse if err := swag.ReadJSON(b, &res); err != nil { return err } diff --git a/internal/httpclient/models/settings_request.go b/internal/httpclient/models/settings_request.go index d19728b938a..d6a613ef21a 100644 --- a/internal/httpclient/models/settings_request.go +++ b/internal/httpclient/models/settings_request.go @@ -62,6 +62,9 @@ type SettingsRequest struct { // state // Required: true State State `json:"state"` + + // type + Type Type `json:"type,omitempty"` } // Validate validates this settings request @@ -100,6 +103,10 @@ func (m *SettingsRequest) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := m.validateType(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -217,6 +224,22 @@ func (m *SettingsRequest) validateState(formats strfmt.Registry) error { return nil } +func (m *SettingsRequest) validateType(formats strfmt.Registry) error { + + if swag.IsZero(m.Type) { // not required + return nil + } + + if err := m.Type.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("type") + } + return err + } + + return nil +} + // MarshalBinary interface implementation func (m *SettingsRequest) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/internal/testhelpers/errorx.go b/internal/testhelpers/errorx.go index 994d9181814..e4fb7dae4a1 100644 --- a/internal/testhelpers/errorx.go +++ b/internal/testhelpers/errorx.go @@ -16,6 +16,7 @@ import ( "github.com/ory/kratos/driver/configuration" "github.com/ory/kratos/selfservice/errorx" + "github.com/ory/kratos/session" "github.com/ory/kratos/x" ) @@ -45,3 +46,17 @@ func NewRedirTS(t *testing.T, body string) *httptest.Server { viper.Set(configuration.ViperKeySelfServiceBrowserDefaultReturnTo, ts.URL) return ts } + +func NewRedirSessionEchoTS(t *testing.T, reg interface { + x.WriterProvider + session.ManagementProvider +}) *httptest.Server { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + sess, err := reg.SessionManager().FetchFromRequest(r.Context(), r) + require.NoError(t, err, "Headers: %+v", r.Header) + reg.Writer().Write(w, r, sess) + })) + t.Cleanup(ts.Close) + viper.Set(configuration.ViperKeySelfServiceBrowserDefaultReturnTo, ts.URL+"/return-ts") + return ts +} diff --git a/internal/testhelpers/selfservice_settings.go b/internal/testhelpers/selfservice_settings.go index 63be3a2f551..c77de6a1a02 100644 --- a/internal/testhelpers/selfservice_settings.go +++ b/internal/testhelpers/selfservice_settings.go @@ -2,10 +2,8 @@ package testhelpers import ( - "bytes" "context" "encoding/json" - "fmt" "io/ioutil" "net/http" "net/url" @@ -32,28 +30,6 @@ import ( "github.com/ory/kratos/x" ) -func HookConfigRedirectTo(t *testing.T, u string) (m []map[string]interface{}) { - var b bytes.Buffer - _, err := fmt.Fprintf(&b, `[ - { - "hook": "redirect", - "config": { - "default_redirect_url": "%s", - "allow_user_defined_redirect": true - } - } -]`, u) - require.NoError(t, err) - require.NoError(t, json.NewDecoder(&b).Decode(&m)) - - return m -} - -func HookVerify(t *testing.T) (m []map[string]interface{}) { - require.NoError(t, json.NewDecoder(bytes.NewBufferString(`[{"job": "verify"}]`)).Decode(&m)) - return m -} - func GetSettingsRequest(t *testing.T, primaryUser *http.Client, ts *httptest.Server) *common.GetSelfServiceBrowserSettingsRequestOK { publicClient := NewSDKClient(ts)