snapshot of https://github.com/ory/kratos.git (master, 2026-09-15; blobs > 131072B omitted)
Some checks failed
CI / Run tests and lints (push) Failing after 29s
CI / Build CLI docs (push) Has been skipped
CI / Run Playwright end-to-end tests (mysql) (push) Failing after 3s
CI / Run Playwright end-to-end tests (postgres) (push) Failing after 2s
CI / Run Playwright end-to-end tests (sqlite) (push) Failing after 3s
CodeQL / Analyze (go) (push) Failing after 4s
CodeQL / Analyze (javascript) (push) Failing after 3s
Docker Image Scanners / scanners (push) Failing after 4s
Synchronize Issue Labels / Synchronize Issue Labels (push) Has been skipped
CI / Run end-to-end tests (postgres) (push) Failing after 19s
CI / Run end-to-end tests (sqlite) (push) Failing after 2s
CI / Run Playwright end-to-end tests (cockroach) (push) Failing after 2s
CI / Draft newsletter (push) Has been skipped
CI / Generate release (push) Has been skipped
CI / Pending approval Slack notification (push) Has been skipped
CI / Send newsletter (push) Has been skipped
Some checks failed
CI / Run tests and lints (push) Failing after 29s
CI / Build CLI docs (push) Has been skipped
CI / Run Playwright end-to-end tests (mysql) (push) Failing after 3s
CI / Run Playwright end-to-end tests (postgres) (push) Failing after 2s
CI / Run Playwright end-to-end tests (sqlite) (push) Failing after 3s
CodeQL / Analyze (go) (push) Failing after 4s
CodeQL / Analyze (javascript) (push) Failing after 3s
Docker Image Scanners / scanners (push) Failing after 4s
Synchronize Issue Labels / Synchronize Issue Labels (push) Has been skipped
CI / Run end-to-end tests (postgres) (push) Failing after 19s
CI / Run end-to-end tests (sqlite) (push) Failing after 2s
CI / Run Playwright end-to-end tests (cockroach) (push) Failing after 2s
CI / Draft newsletter (push) Has been skipped
CI / Generate release (push) Has been skipped
CI / Pending approval Slack notification (push) Has been skipped
CI / Send newsletter (push) Has been skipped
This commit is contained in:
14
persistence/sql/.soda.yml
Normal file
14
persistence/sql/.soda.yml
Normal file
@@ -0,0 +1,14 @@
|
||||
development:
|
||||
url: sqlite://a/b
|
||||
|
||||
sqlite:
|
||||
url: sqlite://a/b
|
||||
|
||||
postgres:
|
||||
url: postgres://a/b
|
||||
|
||||
mysql:
|
||||
url: mysql://tcp(a)/b?parseTime=true&multiStatements=true
|
||||
|
||||
cockroach:
|
||||
url: crdb://a/b
|
||||
45
persistence/sql/README.md
Normal file
45
persistence/sql/README.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# SQL Migrations
|
||||
|
||||
Migrations consist of one `up` and one `down` file.
|
||||
To create these SQL migrations, copy the last migration in `./persistence/sql/migrations/sql` and change the timestamp to the current timestamp and the name to the desired name.
|
||||
|
||||
If some logic is different for one of the database systems, add the id after the name to the file name.
|
||||
The content of that file will override the content of the "general" file for that particular DB system.
|
||||
|
||||
Example:
|
||||
|
||||
`20220802103909000000_courier_send_count.up.sql`
|
||||
and
|
||||
`20220802103909000000_courier_send_count.down.sql`
|
||||
|
||||
With for example cockroach specific behavior:
|
||||
|
||||
`20220802103909000000_courier_send_count.cockroach.up.sql`
|
||||
and
|
||||
`20220802103909000000_courier_send_count.cockroach.down.sql`
|
||||
|
||||
Replace `cockroach` with `mysql`, `postgres` or `sqlite` if applicable.
|
||||
|
||||
## Old Way
|
||||
|
||||
To create SQL migrations, target each database individually and run
|
||||
|
||||
```
|
||||
$ dialect=mysql # or postgres|cockroach|sqlite
|
||||
$ name=
|
||||
$ ory dev pop migration create -d=$dialect ./persistence/sql/migrations/templates $name
|
||||
$ soda generate sql -e mysql -c ./persistence/sql/.soda.yml -p ./persistence/sql/migrations/templates [name]
|
||||
$ soda generate sql -e sqlite -c ./persistence/sql/.soda.yml -p ./persistence/sql/migrations/templates [name]
|
||||
$ soda generate sql -e postgres -c ./persistence/sql/.soda.yml -p ./persistence/sql/migrations/templates [name]
|
||||
$ soda generate sql -e cockroach -c ./persistence/sql/.soda.yml -p ./persistence/sql/migrations/templates [name]
|
||||
```
|
||||
|
||||
and remove the `sqlite` part from the newly generated file to create a SQL migrations that works with all
|
||||
aforementioned databases.
|
||||
|
||||
## Rendering Migrations
|
||||
|
||||
Because migrations needs to be backwards compatible, and because fizz migrations might change, we render
|
||||
fizz migrations to raw SQL statements using `make migrations-render`.
|
||||
|
||||
The concrete migrations being applied can be found in [`./migrations/sql`](./migrations/sql).
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"TableName": "\"identities\"",
|
||||
"ColumnsDecl": "\"available_aal\", \"created_at\", \"external_id\", \"id\", \"metadata_admin\", \"metadata_public\", \"nid\", \"organization_id\", \"schema_id\", \"state\", \"state_changed_at\", \"traits\", \"updated_at\"",
|
||||
"Columns": [
|
||||
"available_aal",
|
||||
"created_at",
|
||||
"external_id",
|
||||
"id",
|
||||
"metadata_admin",
|
||||
"metadata_public",
|
||||
"nid",
|
||||
"organization_id",
|
||||
"schema_id",
|
||||
"state",
|
||||
"state_changed_at",
|
||||
"traits",
|
||||
"updated_at"
|
||||
],
|
||||
"Placeholders": "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"TableName": "\"identity_recovery_addresses\"",
|
||||
"ColumnsDecl": "\"break_glass_for_organization\", \"created_at\", \"id\", \"identity_id\", \"nid\", \"updated_at\", \"value\", \"via\"",
|
||||
"Columns": [
|
||||
"break_glass_for_organization",
|
||||
"created_at",
|
||||
"id",
|
||||
"identity_id",
|
||||
"nid",
|
||||
"updated_at",
|
||||
"value",
|
||||
"via"
|
||||
],
|
||||
"Placeholders": "(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?)"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"TableName": "\"identity_recovery_addresses\"",
|
||||
"ColumnsDecl": "\"break_glass_for_organization\", \"created_at\", \"id\", \"identity_id\", \"nid\", \"updated_at\", \"value\", \"via\"",
|
||||
"Columns": [
|
||||
"break_glass_for_organization",
|
||||
"created_at",
|
||||
"id",
|
||||
"identity_id",
|
||||
"nid",
|
||||
"updated_at",
|
||||
"value",
|
||||
"via"
|
||||
],
|
||||
"Placeholders": "(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?)"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"TableName": "\"test_models\"",
|
||||
"ColumnsDecl": "\"created_at\", \"id\", \"int\", \"nid\", \"null_time_ptr\", \"string\", \"traits\", \"updated_at\"",
|
||||
"Columns": [
|
||||
"created_at",
|
||||
"id",
|
||||
"int",
|
||||
"nid",
|
||||
"null_time_ptr",
|
||||
"string",
|
||||
"traits",
|
||||
"updated_at"
|
||||
],
|
||||
"Placeholders": "(?, ?, ?, ?, ?, ?, ?, ?),\n(?, gen_random_uuid(), ?, ?, ?, ?, ?, ?),\n(?, gen_random_uuid(), ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, gen_random_uuid(), ?, ?, ?, ?, ?, ?),\n(?, gen_random_uuid(), ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, gen_random_uuid(), ?, ?, ?, ?, ?, ?),\n(?, gen_random_uuid(), ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?)"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"TableName": "\"test_models\"",
|
||||
"ColumnsDecl": "\"created_at\", \"id\", \"int\", \"nid\", \"null_time_ptr\", \"string\", \"traits\", \"updated_at\"",
|
||||
"Columns": [
|
||||
"created_at",
|
||||
"id",
|
||||
"int",
|
||||
"nid",
|
||||
"null_time_ptr",
|
||||
"string",
|
||||
"traits",
|
||||
"updated_at"
|
||||
],
|
||||
"Placeholders": "(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?)"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"TableName": "\"test_models\"",
|
||||
"ColumnsDecl": "\"created_at\", \"id\", \"int\", \"nid\", \"null_time_ptr\", \"string\", \"traits\", \"updated_at\", \"crdb_region\"",
|
||||
"Columns": [
|
||||
"created_at",
|
||||
"id",
|
||||
"int",
|
||||
"nid",
|
||||
"null_time_ptr",
|
||||
"string",
|
||||
"traits",
|
||||
"updated_at",
|
||||
"crdb_region"
|
||||
],
|
||||
"Placeholders": "(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?),\n(?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
[
|
||||
"2023-01-01T00:00:00Z",
|
||||
"2023-01-01T00:00:00Z",
|
||||
"string",
|
||||
42,
|
||||
null,
|
||||
{
|
||||
"foo": "bar"
|
||||
}
|
||||
]
|
||||
382
persistence/sql/batch/create.go
Normal file
382
persistence/sql/batch/create.go
Normal file
@@ -0,0 +1,382 @@
|
||||
// Copyright © 2023 Ory Corp
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package batch
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"slices"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/jmoiron/sqlx/reflectx"
|
||||
"github.com/pkg/errors"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/ory/kratos/identity"
|
||||
"github.com/ory/pop/v6"
|
||||
"github.com/ory/x/dbal"
|
||||
"github.com/ory/x/otelx"
|
||||
"github.com/ory/x/sqlcon"
|
||||
"github.com/ory/x/sqlxx"
|
||||
)
|
||||
|
||||
type (
|
||||
insertQueryArgs struct {
|
||||
TableName string
|
||||
ColumnsDecl string
|
||||
Columns []string
|
||||
Placeholders string
|
||||
}
|
||||
quoter interface {
|
||||
Quote(key string) string
|
||||
}
|
||||
TracerConnection struct {
|
||||
Tracer *otelx.Tracer
|
||||
Connection *pop.Connection
|
||||
}
|
||||
|
||||
// PartialConflictError represents a partial conflict during [Create]. It always
|
||||
// wraps a [sqlcon.ErrUniqueViolation], so that the caller can either abort the
|
||||
// whole transaction, or handle the partial success.
|
||||
PartialConflictError[T any] struct {
|
||||
Failed []*T
|
||||
}
|
||||
)
|
||||
|
||||
func (p *PartialConflictError[T]) Error() string {
|
||||
return fmt.Sprintf("partial conflict error: %d models failed to insert", len(p.Failed))
|
||||
}
|
||||
|
||||
func (p *PartialConflictError[T]) ErrOrNil() error {
|
||||
if len(p.Failed) == 0 {
|
||||
return nil
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *PartialConflictError[T]) Unwrap() error {
|
||||
if len(p.Failed) == 0 {
|
||||
return nil
|
||||
}
|
||||
return sqlcon.ErrUniqueViolation()
|
||||
}
|
||||
|
||||
func buildInsertQueryArgs[T any](ctx context.Context, models []*T, opts *createOpts) insertQueryArgs {
|
||||
var (
|
||||
v T
|
||||
model = pop.NewModel(v, ctx)
|
||||
|
||||
columns []string
|
||||
quotedColumns []string
|
||||
placeholders []string
|
||||
placeholderRow []string
|
||||
)
|
||||
|
||||
for _, col := range model.Columns().Cols {
|
||||
columns = append(columns, col.Name)
|
||||
placeholderRow = append(placeholderRow, "?")
|
||||
}
|
||||
|
||||
// We sort for the sole reason that the test snapshots are deterministic.
|
||||
sort.Strings(columns)
|
||||
|
||||
// Extra columns trail the sorted model columns; values are appended in
|
||||
// the same order in buildInsertQueryValues.
|
||||
for _, ec := range opts.extraColumns {
|
||||
columns = append(columns, ec.K)
|
||||
placeholderRow = append(placeholderRow, "?")
|
||||
}
|
||||
|
||||
for _, col := range columns {
|
||||
quotedColumns = append(quotedColumns, opts.quoter.Quote(col))
|
||||
}
|
||||
|
||||
// We generate a list (for every row one) of VALUE statements here that
|
||||
// will be substituted by their column values later:
|
||||
//
|
||||
// (?, ?, ?, ?),
|
||||
// (?, ?, ?, ?),
|
||||
// (?, ?, ?, ?)
|
||||
for _, m := range models {
|
||||
m := reflect.ValueOf(m)
|
||||
|
||||
pl := make([]string, len(placeholderRow))
|
||||
copy(pl, placeholderRow)
|
||||
|
||||
// PostgreSQL-compatible databases can generate UUIDs using
|
||||
// "gen_random_uuid()", which ends up in a VALUE statement of:
|
||||
//
|
||||
// (gen_random_uuid(), ?, ?, ?),
|
||||
for k := range placeholderRow {
|
||||
if columns[k] != "id" {
|
||||
continue
|
||||
}
|
||||
|
||||
field := opts.mapper.FieldByName(m, columns[k])
|
||||
val, ok := field.Interface().(uuid.UUID)
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
|
||||
if val == uuid.Nil && dbal.IsPostgresCompatible(opts.dialect) && !opts.partialInserts {
|
||||
pl[k] = "gen_random_uuid()"
|
||||
break
|
||||
}
|
||||
}
|
||||
placeholders = append(placeholders, fmt.Sprintf("(%s)", strings.Join(pl, ", ")))
|
||||
}
|
||||
|
||||
return insertQueryArgs{
|
||||
TableName: opts.quoter.Quote(model.TableName()),
|
||||
ColumnsDecl: strings.Join(quotedColumns, ", "),
|
||||
Columns: columns,
|
||||
Placeholders: strings.Join(placeholders, ",\n"),
|
||||
}
|
||||
}
|
||||
|
||||
func buildInsertQueryValues[T any](columns []string, models []*T, opts *createOpts) (values []any, err error) {
|
||||
for _, m := range models {
|
||||
m := reflect.ValueOf(m)
|
||||
|
||||
now := opts.now()
|
||||
// Model fields only — extra columns aren't on the struct.
|
||||
modelColumnCount := len(columns) - len(opts.extraColumns)
|
||||
for _, c := range columns[:modelColumnCount] {
|
||||
field := opts.mapper.FieldByName(m, c)
|
||||
|
||||
switch c {
|
||||
case "created_at":
|
||||
if pop.IsZeroOfUnderlyingType(field.Interface()) {
|
||||
field.Set(reflect.ValueOf(now))
|
||||
}
|
||||
case "updated_at":
|
||||
field.Set(reflect.ValueOf(now))
|
||||
case "id":
|
||||
if field.Interface().(uuid.UUID) != uuid.Nil {
|
||||
break // breaks switch, not for
|
||||
} else if dbal.IsPostgresCompatible(opts.dialect) && !opts.partialInserts {
|
||||
// This is a special case:
|
||||
// 1. We're using a PostgreSQL-compatible database.
|
||||
// 2. It's the primary key field ("ID")
|
||||
// 3. A UUID was not yet set.
|
||||
//
|
||||
// If all these conditions meet, the VALUE statement will look as such:
|
||||
//
|
||||
// (gen_random_uuid(), ?, ?, ?, ...)
|
||||
//
|
||||
// For that reason, we do not add the ID value to the list of arguments,
|
||||
// because one of the arguments is using a built-in and thus doesn't need a value.
|
||||
continue // break switch, not for
|
||||
}
|
||||
|
||||
id, err := uuid.NewV4()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
field.Set(reflect.ValueOf(id))
|
||||
}
|
||||
|
||||
values = append(values, field.Interface())
|
||||
|
||||
// Special-handling for *sqlxx.NullTime: mapper.FieldByName sets this to a zero time.Time,
|
||||
// but we want a nil pointer instead.
|
||||
if i, ok := field.Interface().(*sqlxx.NullTime); ok {
|
||||
if time.Time(*i).IsZero() {
|
||||
field.Set(reflect.Zero(field.Type()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for _, ec := range opts.extraColumns {
|
||||
values = append(values, ec.V)
|
||||
}
|
||||
}
|
||||
|
||||
return values, nil
|
||||
}
|
||||
|
||||
type createOpts struct {
|
||||
partialInserts bool
|
||||
dialect string
|
||||
mapper *reflectx.Mapper
|
||||
quoter quoter
|
||||
now func() time.Time
|
||||
extraColumns []identity.ExtraColumn
|
||||
}
|
||||
|
||||
type CreateOpts func(*createOpts)
|
||||
|
||||
// WithExtraColumns appends fixed (K, V) columns to every row of the batch.
|
||||
// All rows receive the same values; group rows by extra-column values first.
|
||||
func WithExtraColumns(cols []identity.ExtraColumn) CreateOpts {
|
||||
return func(o *createOpts) {
|
||||
o.extraColumns = append(o.extraColumns, cols...)
|
||||
}
|
||||
}
|
||||
|
||||
// WithPartialInserts allows to insert only the models that do not conflict with
|
||||
// an existing record. WithPartialInserts will also generate the IDs for the
|
||||
// models before inserting them, so that the successful inserts can be correlated
|
||||
// with the input models.
|
||||
//
|
||||
// In particular, WithPartialInserts does not work with MySQL, because it does
|
||||
// not support the "RETURNING" clause.
|
||||
//
|
||||
// WithPartialInserts does not work with CockroachDB and gen_random_uuid(),
|
||||
// because then the successful inserts cannot be correlated with the input
|
||||
// models. Note: gen_random_uuid() will skip the UNIQUE constraint check, which
|
||||
// needs to hit all regions in a distributed setup. Therefore, WithPartialInserts
|
||||
// should not be used to insert models for only a single identity.
|
||||
var WithPartialInserts CreateOpts = func(o *createOpts) {
|
||||
o.partialInserts = true
|
||||
}
|
||||
|
||||
func newCreateOpts(conn *pop.Connection, opts ...CreateOpts) *createOpts {
|
||||
o := new(createOpts)
|
||||
o.dialect = conn.Dialect.Name()
|
||||
o.mapper = conn.TX.Mapper
|
||||
o.quoter = conn.Dialect.(quoter)
|
||||
o.now = func() time.Time { return time.Now().UTC().Truncate(time.Microsecond) }
|
||||
for _, f := range opts {
|
||||
f(o)
|
||||
}
|
||||
return o
|
||||
}
|
||||
|
||||
// Create batch-inserts the given models into the database using a single INSERT
|
||||
// statement. By default, the models are either all created or none. If
|
||||
// [WithPartialInserts] is passed as an option, partial inserts are supported,
|
||||
// and the models that could not be inserted are returned in an
|
||||
// [PartialConflictError].
|
||||
func Create[T any](ctx context.Context, p *TracerConnection, models []*T, opts ...CreateOpts) (err error) {
|
||||
ctx, span := p.Tracer.Tracer().Start(ctx, "persistence.sql.batch.Create",
|
||||
trace.WithAttributes(attribute.Int("count", len(models))))
|
||||
defer otelx.End(span, &err)
|
||||
|
||||
if len(models) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
var v T
|
||||
model := pop.NewModel(v, ctx)
|
||||
|
||||
conn := p.Connection
|
||||
options := newCreateOpts(conn, opts...)
|
||||
|
||||
queryArgs := buildInsertQueryArgs(ctx, models, options)
|
||||
values, err := buildInsertQueryValues(queryArgs.Columns, models, options)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var returningClause string
|
||||
if conn.Dialect.Name() != dbal.DriverMySQL {
|
||||
// PostgreSQL, CockroachDB, YugabyteDB, and SQLite support RETURNING.
|
||||
if options.partialInserts {
|
||||
returningClause = fmt.Sprintf("ON CONFLICT DO NOTHING RETURNING %s", model.IDField())
|
||||
} else {
|
||||
returningClause = fmt.Sprintf("RETURNING %s", model.IDField())
|
||||
}
|
||||
}
|
||||
|
||||
query := conn.Dialect.TranslateSQL(fmt.Sprintf(
|
||||
"INSERT INTO %s (%s) VALUES\n%s\n%s",
|
||||
queryArgs.TableName,
|
||||
queryArgs.ColumnsDecl,
|
||||
queryArgs.Placeholders,
|
||||
returningClause,
|
||||
))
|
||||
|
||||
rows, err := conn.TX.QueryContext(ctx, query, values...)
|
||||
if err != nil {
|
||||
return sqlcon.HandleError(err)
|
||||
}
|
||||
defer func() { _ = rows.Close() }()
|
||||
|
||||
// MySQL, which does not support RETURNING, also does not have ON CONFLICT DO
|
||||
// NOTHING, meaning that MySQL will always fail the whole transaction on a single
|
||||
// record conflict.
|
||||
if conn.Dialect.Name() == dbal.DriverMySQL {
|
||||
return nil
|
||||
}
|
||||
|
||||
if options.partialInserts {
|
||||
return handlePartialInserts(queryArgs, values, models, rows)
|
||||
} else {
|
||||
return handleFullInserts(models, rows)
|
||||
}
|
||||
}
|
||||
|
||||
func handleFullInserts[T any](models []*T, rows *sql.Rows) error {
|
||||
// Hydrate the models from the RETURNING clause.
|
||||
for i := 0; rows.Next(); i++ {
|
||||
var id uuid.UUID
|
||||
if err := rows.Scan(&id); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
if err := setModelID(id, models[i]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return sqlcon.HandleError(err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func handlePartialInserts[T any](queryArgs insertQueryArgs, values []any, models []*T, rows *sql.Rows) error {
|
||||
// Hydrate the models from the RETURNING clause.
|
||||
idsInDB := make(map[uuid.UUID]struct{})
|
||||
for rows.Next() {
|
||||
var id uuid.UUID
|
||||
if err := rows.Scan(&id); err != nil {
|
||||
return errors.WithStack(err)
|
||||
}
|
||||
idsInDB[id] = struct{}{}
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return sqlcon.HandleError(err)
|
||||
}
|
||||
|
||||
idIdx := slices.Index(queryArgs.Columns, "id")
|
||||
if idIdx == -1 {
|
||||
return errors.New("id column not found")
|
||||
}
|
||||
var idValues []uuid.UUID
|
||||
for i := idIdx; i < len(values); i += len(queryArgs.Columns) {
|
||||
idValues = append(idValues, values[i].(uuid.UUID))
|
||||
}
|
||||
|
||||
var partialConflictError PartialConflictError[T]
|
||||
for i, id := range idValues {
|
||||
if _, ok := idsInDB[id]; !ok {
|
||||
partialConflictError.Failed = append(partialConflictError.Failed, models[i])
|
||||
} else {
|
||||
if err := setModelID(id, models[i]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return partialConflictError.ErrOrNil()
|
||||
}
|
||||
|
||||
// setModelID sets the id field of the model to the id.
|
||||
func setModelID(id uuid.UUID, model any) error {
|
||||
el := reflect.ValueOf(model).Elem()
|
||||
idField := el.FieldByName("ID")
|
||||
if !idField.IsValid() {
|
||||
return errors.New("model does not have a field named id")
|
||||
}
|
||||
idField.Set(reflect.ValueOf(id))
|
||||
|
||||
return nil
|
||||
}
|
||||
240
persistence/sql/batch/create_test.go
Normal file
240
persistence/sql/batch/create_test.go
Normal file
@@ -0,0 +1,240 @@
|
||||
// Copyright © 2023 Ory Corp
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package batch
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/jmoiron/sqlx/reflectx"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/ory/kratos/identity"
|
||||
"github.com/ory/x/dbal"
|
||||
"github.com/ory/x/snapshotx"
|
||||
"github.com/ory/x/sqlxx"
|
||||
)
|
||||
|
||||
type (
|
||||
testModel struct {
|
||||
ID uuid.UUID `db:"id"`
|
||||
NID uuid.UUID `db:"nid"`
|
||||
String string `db:"string"`
|
||||
Int int `db:"int"`
|
||||
Traits identity.Traits `db:"traits"`
|
||||
NullTimePtr *sqlxx.NullTime `db:"null_time_ptr"`
|
||||
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
|
||||
}
|
||||
testQuoter struct{}
|
||||
)
|
||||
|
||||
func (i testModel) TableName(ctx context.Context) string {
|
||||
return "test_models"
|
||||
}
|
||||
|
||||
func (tq testQuoter) Quote(s string) string { return fmt.Sprintf("%q", s) }
|
||||
|
||||
func makeModels[T any]() []*T {
|
||||
models := make([]*T, 10)
|
||||
for k := range models {
|
||||
models[k] = new(T)
|
||||
}
|
||||
return models
|
||||
}
|
||||
|
||||
func Test_buildInsertQueryArgs(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
t.Run("case=testModel", func(t *testing.T) {
|
||||
models := makeModels[testModel]()
|
||||
opts := &createOpts{
|
||||
dialect: "other",
|
||||
quoter: testQuoter{},
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
}
|
||||
args := buildInsertQueryArgs(ctx, models, opts)
|
||||
snapshotx.SnapshotT(t, args)
|
||||
|
||||
query := fmt.Sprintf("INSERT INTO %s (%s) VALUES\n%s", args.TableName, args.ColumnsDecl, args.Placeholders)
|
||||
assert.Equal(t, `INSERT INTO "test_models" ("created_at", "id", "int", "nid", "null_time_ptr", "string", "traits", "updated_at") VALUES
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?),
|
||||
(?, ?, ?, ?, ?, ?, ?, ?)`, query)
|
||||
})
|
||||
|
||||
t.Run("case=Identities", func(t *testing.T) {
|
||||
models := makeModels[identity.Identity]()
|
||||
opts := &createOpts{
|
||||
dialect: "other",
|
||||
quoter: testQuoter{},
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
}
|
||||
args := buildInsertQueryArgs(ctx, models, opts)
|
||||
snapshotx.SnapshotT(t, args)
|
||||
})
|
||||
|
||||
t.Run("case=RecoveryAddress", func(t *testing.T) {
|
||||
models := makeModels[identity.RecoveryAddress]()
|
||||
opts := &createOpts{
|
||||
dialect: "other",
|
||||
quoter: testQuoter{},
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
}
|
||||
args := buildInsertQueryArgs(ctx, models, opts)
|
||||
snapshotx.SnapshotT(t, args)
|
||||
})
|
||||
|
||||
t.Run("case=RecoveryAddress", func(t *testing.T) {
|
||||
models := makeModels[identity.RecoveryAddress]()
|
||||
opts := &createOpts{
|
||||
dialect: "other",
|
||||
quoter: testQuoter{},
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
}
|
||||
args := buildInsertQueryArgs(ctx, models, opts)
|
||||
snapshotx.SnapshotT(t, args)
|
||||
})
|
||||
|
||||
t.Run("case=cockroach", func(t *testing.T) {
|
||||
models := makeModels[testModel]()
|
||||
for k := range models {
|
||||
if k%3 == 0 {
|
||||
models[k].ID = uuid.FromStringOrNil(fmt.Sprintf("ae0125a9-2786-4ada-82d2-d169cf75047%d", k))
|
||||
}
|
||||
}
|
||||
opts := &createOpts{
|
||||
dialect: dbal.DriverCockroachDB,
|
||||
quoter: testQuoter{},
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
}
|
||||
args := buildInsertQueryArgs(ctx, models, opts)
|
||||
snapshotx.SnapshotT(t, args)
|
||||
})
|
||||
|
||||
for _, dialect := range []string{dbal.DriverPostgreSQL, dbal.DriverCockroachDB, dbal.DriverYugabyteDB} {
|
||||
t.Run("case=database generated UUID/"+dialect, func(t *testing.T) {
|
||||
models := makeModels[testModel]()
|
||||
opts := &createOpts{
|
||||
dialect: dialect,
|
||||
quoter: testQuoter{},
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
}
|
||||
args := buildInsertQueryArgs(ctx, models, opts)
|
||||
assert.Contains(t, args.Placeholders, "gen_random_uuid()")
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_buildInsertQueryArgs_ExtraColumns(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
t.Run("case=testModel", func(t *testing.T) {
|
||||
models := makeModels[testModel]()
|
||||
opts := &createOpts{
|
||||
dialect: "other",
|
||||
quoter: testQuoter{},
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
extraColumns: []identity.ExtraColumn{{K: "crdb_region", V: "gcp-europe-west3"}},
|
||||
}
|
||||
args := buildInsertQueryArgs(ctx, models, opts)
|
||||
snapshotx.SnapshotT(t, args)
|
||||
|
||||
assert.Contains(t, args.ColumnsDecl, `"crdb_region"`)
|
||||
assert.Contains(t, args.Placeholders, "?")
|
||||
})
|
||||
}
|
||||
|
||||
func Test_buildInsertQueryValues_ExtraColumns(t *testing.T) {
|
||||
t.Run("case=testModel", func(t *testing.T) {
|
||||
model := &testModel{
|
||||
String: "string",
|
||||
Int: 42,
|
||||
Traits: []byte(`{"foo": "bar"}`),
|
||||
}
|
||||
|
||||
frozenTime := time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)
|
||||
opts := &createOpts{
|
||||
dialect: "other",
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
quoter: testQuoter{},
|
||||
now: func() time.Time { return frozenTime },
|
||||
extraColumns: []identity.ExtraColumn{{K: "crdb_region", V: "gcp-europe-west3"}},
|
||||
}
|
||||
|
||||
// columns includes the extra column name, mirroring what buildInsertQueryArgs returns.
|
||||
values, err := buildInsertQueryValues(
|
||||
[]string{"created_at", "updated_at", "id", "string", "int", "null_time_ptr", "traits", "crdb_region"},
|
||||
[]*testModel{model},
|
||||
opts,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
// The last value should be the extra column value.
|
||||
// 7 model fields + 1 extra column = 8 total.
|
||||
require.Len(t, values, 8)
|
||||
assert.Equal(t, "gcp-europe-west3", values[len(values)-1])
|
||||
})
|
||||
}
|
||||
|
||||
func Test_buildInsertQueryValues(t *testing.T) {
|
||||
t.Run("case=testModel", func(t *testing.T) {
|
||||
model := &testModel{
|
||||
String: "string",
|
||||
Int: 42,
|
||||
Traits: []byte(`{"foo": "bar"}`),
|
||||
}
|
||||
|
||||
frozenTime := time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC)
|
||||
opts := &createOpts{
|
||||
mapper: reflectx.NewMapper("db"),
|
||||
quoter: testQuoter{},
|
||||
now: func() time.Time { return frozenTime },
|
||||
}
|
||||
|
||||
t.Run("case=cockroach", func(t *testing.T) {
|
||||
opts.dialect = dbal.DriverCockroachDB
|
||||
values, err := buildInsertQueryValues(
|
||||
[]string{"created_at", "updated_at", "id", "string", "int", "null_time_ptr", "traits"},
|
||||
[]*testModel{model},
|
||||
opts,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
snapshotx.SnapshotT(t, values)
|
||||
})
|
||||
|
||||
t.Run("case=others", func(t *testing.T) {
|
||||
opts.dialect = "other"
|
||||
values, err := buildInsertQueryValues(
|
||||
[]string{"created_at", "updated_at", "id", "string", "int", "null_time_ptr", "traits"},
|
||||
[]*testModel{model},
|
||||
opts,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, frozenTime, model.CreatedAt)
|
||||
assert.Equal(t, model.CreatedAt, values[0])
|
||||
|
||||
assert.Equal(t, frozenTime, model.UpdatedAt)
|
||||
assert.Equal(t, model.UpdatedAt, values[1])
|
||||
|
||||
assert.NotZero(t, model.ID)
|
||||
assert.Equal(t, model.ID, values[2])
|
||||
|
||||
assert.Equal(t, model.String, values[3])
|
||||
assert.Equal(t, model.Int, values[4])
|
||||
|
||||
assert.Nil(t, model.NullTimePtr)
|
||||
})
|
||||
})
|
||||
}
|
||||
111
persistence/sql/batch/test_persister.go
Normal file
111
persistence/sql/batch/test_persister.go
Normal file
@@ -0,0 +1,111 @@
|
||||
// Copyright © 2024 Ory Corp
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package batch
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/ory/kratos/identity"
|
||||
"github.com/ory/kratos/persistence"
|
||||
"github.com/ory/pop/v6"
|
||||
"github.com/ory/x/dbal"
|
||||
"github.com/ory/x/otelx"
|
||||
"github.com/ory/x/sqlcon"
|
||||
)
|
||||
|
||||
func TestPersister(ctx context.Context, tracer *otelx.Tracer, p persistence.Persister) func(t *testing.T) {
|
||||
return func(t *testing.T) {
|
||||
t.Run("method=batch.Create", func(t *testing.T) {
|
||||
ident1 := identity.NewIdentity("")
|
||||
ident1.NID = p.NetworkID(ctx)
|
||||
ident2 := identity.NewIdentity("")
|
||||
ident2.NID = p.NetworkID(ctx)
|
||||
|
||||
// Create two identities
|
||||
_ = p.Transaction(ctx, func(ctx context.Context, tx *pop.Connection) error {
|
||||
conn := &TracerConnection{
|
||||
Tracer: tracer,
|
||||
Connection: tx,
|
||||
}
|
||||
|
||||
err := Create(ctx, conn, []*identity.Identity{ident1, ident2})
|
||||
require.NoError(t, err)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
require.NotEqual(t, uuid.Nil, ident1.ID)
|
||||
require.NotEqual(t, uuid.Nil, ident2.ID)
|
||||
|
||||
// Create conflicting verifiable addresses
|
||||
addresses := []*identity.VerifiableAddress{{
|
||||
Value: "foo.1@bar.de",
|
||||
IdentityID: ident1.ID,
|
||||
NID: ident1.NID,
|
||||
}, {
|
||||
Value: "foo.2@bar.de",
|
||||
IdentityID: ident1.ID,
|
||||
NID: ident1.NID,
|
||||
}, {
|
||||
Value: "conflict@bar.de",
|
||||
IdentityID: ident1.ID,
|
||||
NID: ident1.NID,
|
||||
}, {
|
||||
Value: "foo.3@bar.de",
|
||||
IdentityID: ident1.ID,
|
||||
NID: ident1.NID,
|
||||
}, {
|
||||
Value: "conflict@bar.de",
|
||||
IdentityID: ident1.ID,
|
||||
NID: ident1.NID,
|
||||
}, {
|
||||
Value: "foo.4@bar.de",
|
||||
IdentityID: ident1.ID,
|
||||
NID: ident1.NID,
|
||||
}}
|
||||
|
||||
t.Run("case=fails all without partial inserts", func(t *testing.T) {
|
||||
_ = p.Transaction(ctx, func(ctx context.Context, tx *pop.Connection) error {
|
||||
conn := &TracerConnection{
|
||||
Tracer: tracer,
|
||||
Connection: tx,
|
||||
}
|
||||
err := Create(ctx, conn, addresses)
|
||||
assert.ErrorIs(t, err, sqlcon.ErrUniqueViolation())
|
||||
if partial := new(PartialConflictError[identity.VerifiableAddress]); errors.As(err, &partial) {
|
||||
require.NoError(t, partial, "expected no partial error")
|
||||
}
|
||||
return err
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("case=return partial error with partial inserts", func(t *testing.T) {
|
||||
_ = p.Transaction(ctx, func(ctx context.Context, tx *pop.Connection) error {
|
||||
conn := &TracerConnection{
|
||||
Tracer: tracer,
|
||||
Connection: tx,
|
||||
}
|
||||
|
||||
err := Create(ctx, conn, addresses, WithPartialInserts)
|
||||
assert.ErrorIs(t, err, sqlcon.ErrUniqueViolation())
|
||||
|
||||
if conn.Connection.Dialect.Name() != dbal.DriverMySQL {
|
||||
// MySQL does not support partial errors.
|
||||
partialErr := new(PartialConflictError[identity.VerifiableAddress])
|
||||
require.ErrorAs(t, err, &partialErr)
|
||||
assert.Len(t, partialErr.Failed, 1)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
45
persistence/sql/devices/persister_devices.go
Normal file
45
persistence/sql/devices/persister_devices.go
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright © 2023 Ory Corp
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package devices
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
|
||||
"github.com/ory/kratos/session"
|
||||
"github.com/ory/pop/v6"
|
||||
"github.com/ory/x/contextx"
|
||||
"github.com/ory/x/popx"
|
||||
"github.com/ory/x/sqlcon"
|
||||
)
|
||||
|
||||
var _ session.DevicePersister = (*DevicePersister)(nil)
|
||||
|
||||
type DevicePersister struct {
|
||||
ctxer contextx.Provider
|
||||
c *pop.Connection
|
||||
nid uuid.UUID
|
||||
}
|
||||
|
||||
func NewPersister(r contextx.Provider, c *pop.Connection) *DevicePersister {
|
||||
return &DevicePersister{
|
||||
ctxer: r,
|
||||
c: c,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *DevicePersister) NetworkID(ctx context.Context) uuid.UUID {
|
||||
return p.ctxer.Contextualizer().Network(ctx, p.nid)
|
||||
}
|
||||
|
||||
func (p DevicePersister) WithNetworkID(nid uuid.UUID) session.DevicePersister {
|
||||
p.nid = nid
|
||||
return &p
|
||||
}
|
||||
|
||||
func (p *DevicePersister) CreateDevice(ctx context.Context, d *session.Device) error {
|
||||
d.NID = p.NetworkID(ctx)
|
||||
return sqlcon.HandleError(popx.GetConnection(ctx, p.c.WithContext(ctx)).Create(d))
|
||||
}
|
||||
62
persistence/sql/identity/partial_inserts_internal_test.go
Normal file
62
persistence/sql/identity/partial_inserts_internal_test.go
Normal file
@@ -0,0 +1,62 @@
|
||||
// Copyright © 2026 Ory Corp
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package identity
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/ory/kratos/identity"
|
||||
"github.com/ory/x/sqlxx"
|
||||
)
|
||||
|
||||
func TestIdentitiesNeedPartialInserts(t *testing.T) {
|
||||
withExternalID := func(id string) *identity.Identity {
|
||||
return &identity.Identity{ExternalID: sqlxx.NullString(id)}
|
||||
}
|
||||
|
||||
for _, tc := range []struct {
|
||||
name string
|
||||
identities []*identity.Identity
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "empty batch",
|
||||
identities: nil,
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "single identity without external id",
|
||||
identities: []*identity.Identity{{}},
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "single identity with external id",
|
||||
identities: []*identity.Identity{withExternalID("ext-1")},
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
// The identities insert cannot conflict without an external id (the
|
||||
// only unique constraint), so partial inserts are unnecessary.
|
||||
name: "many identities without external ids",
|
||||
identities: []*identity.Identity{{}, {}, {}},
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "many identities, one with external id",
|
||||
identities: []*identity.Identity{{}, withExternalID("ext-1"), {}},
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "many identities all with external ids",
|
||||
identities: []*identity.Identity{withExternalID("ext-1"), withExternalID("ext-2")},
|
||||
want: true,
|
||||
},
|
||||
} {
|
||||
t.Run("case="+tc.name, func(t *testing.T) {
|
||||
assert.Equal(t, tc.want, identitiesNeedPartialInserts(tc.identities))
|
||||
})
|
||||
}
|
||||
}
|
||||
2188
persistence/sql/identity/persister_identity.go
Normal file
2188
persistence/sql/identity/persister_identity.go
Normal file
File diff suppressed because it is too large
Load Diff
122
persistence/sql/identity/persister_identity_test.go
Normal file
122
persistence/sql/identity/persister_identity_test.go
Normal file
@@ -0,0 +1,122 @@
|
||||
// Copyright © 2026 Ory Corp
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
package identity_test
|
||||
|
||||
// Since:
|
||||
// - This is a separate test package
|
||||
// - Go creates one executable per test package
|
||||
// - Go global variables are isolated per process (i.e. executable)
|
||||
// - This test uses its own database
|
||||
// , it means that this test is independent from the others and cannot interfere with them.
|
||||
// We do not need to clear the global maps at the start of the test: they are still pristine (unset).
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/gofrs/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
id "github.com/ory/kratos/identity"
|
||||
"github.com/ory/kratos/persistence/sql/identity"
|
||||
"github.com/ory/kratos/pkg"
|
||||
"github.com/ory/kratos/pkg/testhelpers"
|
||||
"github.com/ory/kratos/x"
|
||||
"github.com/ory/x/dbal"
|
||||
"github.com/ory/x/sqlxx"
|
||||
)
|
||||
|
||||
// TestCreateIdentities_WritesExtraColumns verifies that WithExtraColumns is
|
||||
// forwarded from CreateIdentities down to the batch INSERT.
|
||||
func TestCreateIdentities_WritesExtraColumns(t *testing.T) {
|
||||
_, reg := pkg.NewRegistryDefaultWithDSN(t, dbal.NewSQLiteTestDatabase(t))
|
||||
_, p := testhelpers.NewNetwork(t, t.Context(), reg.Persister())
|
||||
|
||||
require.NoError(t,
|
||||
p.GetConnection(t.Context()).RawQuery(`ALTER TABLE identities ADD COLUMN extra_foo TEXT`).Exec(),
|
||||
)
|
||||
|
||||
ctx := testhelpers.WithDefaultIdentitySchemaFromRaw(t.Context(), []byte(`{"$id":"test","type":"object"}`))
|
||||
|
||||
ident := id.NewIdentity("")
|
||||
require.NoError(t, p.CreateIdentities(ctx, []*id.Identity{ident},
|
||||
id.WithExtraColumns([]id.ExtraColumn{{K: "extra_foo", V: "bar"}}),
|
||||
))
|
||||
|
||||
var got string
|
||||
require.NoError(t,
|
||||
p.GetConnection(t.Context()).RawQuery(
|
||||
`SELECT extra_foo FROM identities WHERE id = ?`, ident.ID,
|
||||
).First(&got),
|
||||
)
|
||||
assert.Equal(t, "bar", got)
|
||||
}
|
||||
|
||||
func TestNonStandardCredentialTypes(t *testing.T) {
|
||||
_, reg := pkg.NewRegistryDefaultWithDSN(t, dbal.NewSQLiteTestDatabase(t))
|
||||
_, p := testhelpers.NewNetwork(t, t.Context(), reg.Persister())
|
||||
|
||||
// Replace the content of the table with custom UUIDs. This relies on the
|
||||
// process-global credential-types cache being pristine, which the header
|
||||
// comment's package isolation guarantees — no other test in this package
|
||||
// touches the cache first.
|
||||
{
|
||||
require.NoError(t, p.GetConnection(t.Context()).RawQuery(`DELETE FROM identity_credential_types`, x.NewUUID()).Exec())
|
||||
|
||||
// Test the case of empty credentials in the database, so that we can exercise the case of loading credentials failing,
|
||||
// and then subsequent loads succeed, and the service does not get suck.
|
||||
_, err := identity.FindIdentityCredentialsTypeByName(p.GetConnection(t.Context()), id.CredentialsTypeOIDC)
|
||||
require.Error(t, err)
|
||||
|
||||
// Now fill the table with non-standard UUIDs.
|
||||
q := strings.Builder{}
|
||||
q.WriteString(`INSERT INTO identity_credential_types (id, name) VALUES `)
|
||||
for i, ct := range id.AllCredentialTypes {
|
||||
fmt.Fprintf(&q, `('%s', '%s')`, x.NewUUID(), ct)
|
||||
if i < len(id.AllCredentialTypes)-1 {
|
||||
q.WriteRune(',')
|
||||
}
|
||||
}
|
||||
require.NoError(t, p.GetConnection(t.Context()).RawQuery(q.String()).Exec())
|
||||
}
|
||||
|
||||
// Valid credential types are found.
|
||||
for _, ct := range id.AllCredentialTypes {
|
||||
t.Run("type="+ct.String(), func(t *testing.T) {
|
||||
id, err := identity.FindIdentityCredentialsTypeByName(p.GetConnection(t.Context()), ct)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NotEqual(t, uuid.Nil, id)
|
||||
name, err := identity.FindIdentityCredentialsTypeByID(p.GetConnection(t.Context()), id)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, ct, name)
|
||||
})
|
||||
}
|
||||
|
||||
// Invalid credential types are not found.
|
||||
_, err := identity.FindIdentityCredentialsTypeByName(p.GetConnection(t.Context()), "unknown")
|
||||
require.Error(t, err)
|
||||
|
||||
_, err = identity.FindIdentityCredentialsTypeByID(p.GetConnection(t.Context()), x.NewUUID())
|
||||
require.Error(t, err)
|
||||
|
||||
// Create an identity and find it by credential identifier.
|
||||
ctx := testhelpers.WithDefaultIdentitySchemaFromRaw(t.Context(), []byte(`{"$id":"test","type":"object"}`))
|
||||
email := "test-" + x.NewUUID().String() + "@example.com"
|
||||
i := id.NewIdentity("")
|
||||
i.SetCredentials(id.CredentialsTypePassword, id.Credentials{
|
||||
Type: id.CredentialsTypePassword,
|
||||
Identifiers: []string{email},
|
||||
Config: sqlxx.JSONRawMessage(`{}`),
|
||||
})
|
||||
require.NoError(t, p.CreateIdentity(ctx, i))
|
||||
|
||||
actualIdentity, actualCreds, err := p.FindByCredentialsIdentifier(ctx, id.CredentialsTypePassword, email)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, i.ID, actualIdentity.ID)
|
||||
assert.Equal(t, []string{email}, actualCreds.Identifiers)
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "0149ce5f-76a8-4efe-b2e3-431b8c6cceb6",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"metadata_public": {
|
||||
"foo": "bar"
|
||||
},
|
||||
"metadata_admin": {
|
||||
"baz": "bar"
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "0149ce5f-76a8-4efe-b2e3-431b8c6cceb7",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbarbar@ory.sh"
|
||||
},
|
||||
"metadata_public": {
|
||||
"foo": "bar"
|
||||
},
|
||||
"metadata_admin": {
|
||||
"baz": "bar"
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "196d8c1e-4f04-40f0-94b3-5ec43996b28a",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"metadata_public": null,
|
||||
"metadata_admin": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "28ff0031-190b-4253-bd15-14308dec013e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbarbarfoo@ory.sh"
|
||||
},
|
||||
"metadata_public": {
|
||||
"foo": "bar"
|
||||
},
|
||||
"metadata_admin": {
|
||||
"baz": "bar"
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "2ae6a5a7-2983-49e7-a4d8-7740b37c88cb",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "d7b10@ory.sh"
|
||||
},
|
||||
"metadata_public": null,
|
||||
"metadata_admin": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "308929d3-41a2-43fe-a33c-75308539d841",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"metadata_public": {
|
||||
"foo": "bar"
|
||||
},
|
||||
"metadata_admin": {
|
||||
"baz": "bar"
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "359963ec-b09b-4ea0-aece-fb4dd95f304a",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "d7b11@ory.sh"
|
||||
},
|
||||
"metadata_public": null,
|
||||
"metadata_admin": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"credentials": {
|
||||
"password": {
|
||||
"type": "password",
|
||||
"identifiers": [
|
||||
"foo2@ory.sh",
|
||||
"foo@ory.sh"
|
||||
],
|
||||
"config": {
|
||||
"hashed_password": "$argon2id$v=19$m=131072,t=2,p=1$lQFPaKxXqPL56/mU7vRi4w$6aldHyBnURt8sP8+xu41Ng"
|
||||
},
|
||||
"version": 1,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
"totp": {
|
||||
"type": "totp",
|
||||
"identifiers": [],
|
||||
"config": {
|
||||
"totp_url": "otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP\u0026issuer=Example"
|
||||
},
|
||||
"version": 0,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
},
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"metadata_admin": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"credentials": {
|
||||
"password": {
|
||||
"type": "password",
|
||||
"identifiers": [
|
||||
"foo1@ory.sh",
|
||||
"foobar@ory.sh"
|
||||
],
|
||||
"config": {
|
||||
"hashed_password": "$argon2id$v=19$m=131072,t=2,p=1$lQFPaKxXqPL56/mU7vRi4w$6aldHyBnURt8sP8+xu41Ng"
|
||||
},
|
||||
"version": 1,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
},
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"metadata_admin": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "d7b9addb-ac15-4bc2-9fa5-562e0bf48755",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "d7b9@ory.sh"
|
||||
},
|
||||
"metadata_public": null,
|
||||
"metadata_admin": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "ed253b2c-48ed-4c58-9b6f-1dc963c30a66",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"metadata_public": null,
|
||||
"metadata_admin": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"id": "bd292366-af32-4ba6-bdf0-11d6d1a217f3",
|
||||
"expires_at": "2022-08-18T08:28:18Z",
|
||||
"issued_at": "2022-08-18T07:28:18Z",
|
||||
"identity_id": "28ff0031-190b-4253-bd15-14308dec013e"
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"id": "00b1517f-2467-4aaf-b0a5-82b4a27dcaf5",
|
||||
"organization_id": null,
|
||||
"oauth2_login_challenge": "challenge data",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "0bc96cc9-dda4-4700-9e42-35731f2af91e",
|
||||
"organization_id": null,
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "1fb23c75-b809-42cc-8984-6ca2d0a1192f",
|
||||
"organization_id": null,
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal2",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "202c1981-1e25-47f0-8764-75ad506c2bec",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "349c945a-60f8-436a-a301-7a42c92604f9",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login?login_challenge=3caddfd599034bce83ffcae36f42dff7",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal2",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "38caf592-b042-4551-b92f-8d5223c2a4e2",
|
||||
"organization_id": null,
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal2",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "3a9ea34f-0f12-469b-9417-3ae5795a7baa",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"id": "43c99182-bb67-47e1-b564-bb23bd8d4393",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login?prompt=login\u0026return_to=http%3A%2F%2F127.0.0.1%3A4455%2F.ory%2Fkratos%2Fpublic%2Fself-service%2Fbrowser%2Fflows%2Fsettings%2Fstrategies%2Fprofile%3Frequest%3D74fd6c53-7651-453e-90b8-2c5adbf911bb",
|
||||
"return_to": "http://127.0.0.1:4455/.ory/kratos/public/self-service/browser/flows/settings/strategies/profile?request=74fd6c53-7651-453e-90b8-2c5adbf911bb",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": true,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "47edd3a8-0998-4779-9469-f4b8ee4430df",
|
||||
"organization_id": null,
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "56d94e8b-8a5d-4b7f-8a6e-3259d2b2903e",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "6d387820-f2f4-4f9f-9980-a90d89e7811f",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "916ded11-aa64-4a27-b06e-96e221a509d7",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "99974ce6-388c-4669-a95a-7757ee724020",
|
||||
"organization_id": null,
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "b1fac7fb-d016-4a06-a7fe-e4eab2a0429f",
|
||||
"organization_id": null,
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"id": "cccccccc-dda4-4700-9e42-35731f2af911",
|
||||
"organization_id": null,
|
||||
"oauth2_login_challenge": "challenge data",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"id": "cccccccc-dda4-4700-9e42-35731f2af91e",
|
||||
"organization_id": null,
|
||||
"oauth2_login_challenge": "challenge data",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "d6aa1f23-88c9-4b9b-a850-392f48c7f9e8",
|
||||
"organization_id": null,
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/login",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"refresh": false,
|
||||
"requested_aal": "aal1",
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"id": "8f75f5d9-9cb4-4848-9a73-9344f686f8a6",
|
||||
"recovery_address": null,
|
||||
"expires_at": "2022-08-18T08:28:18Z",
|
||||
"issued_at": "2022-08-18T07:28:18Z",
|
||||
"identity_id": "308929d3-41a2-43fe-a33c-75308539d841"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "0d14427f-e16d-43a5-8695-8278bf85d4eb",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "link",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "13178936-095a-466b-abe0-36d977d3dc18",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "link",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "4963f305-e874-4a68-8424-a00bec679e7b",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/recovery",
|
||||
"active": "link",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "68fb4010-84a9-4d1e-9f92-2705978ee891",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery/self-service/browser/flows/recovery",
|
||||
"active": "link",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "68fb4010-84a9-4d1e-9f92-2705978ee89e",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/recovery",
|
||||
"active": "link",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "87e871e1-a45f-4ed0-ba4e-a03063c774dc",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "link",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"id": "1b667e6d-8fda-4194-a765-08185185d7e4",
|
||||
"recovery_address": null,
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"identity_id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"id": "5529d454-2946-404e-b681-d950f8657fd0",
|
||||
"recovery_address": null,
|
||||
"expires_at": "2000-01-01T00:00:00Z",
|
||||
"issued_at": "2000-01-01T00:00:00Z",
|
||||
"identity_id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"id": "77ca3f5c-cd39-488b-9f1d-cc7166d14bdc",
|
||||
"recovery_address": null,
|
||||
"expires_at": "2000-01-01T00:00:00Z",
|
||||
"issued_at": "2000-01-01T00:00:00Z",
|
||||
"identity_id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"id": "f1f66a69-ce02-4a12-9591-9e02dda30a0d",
|
||||
"expires_at": "2022-08-18T08:28:18Z",
|
||||
"issued_at": "2022-08-18T07:28:18Z"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "05a7f09d-4ef3-41fb-958a-6ad74584b36a",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "22d58184-b97d-44a5-bbaf-0aa8b4000d81",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "2bf132e0-5d40-4df9-9a11-9106e5333735",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "696e7022-c466-44f6-89c6-8cf93c06a62a",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "69c80296-36cd-4afc-921a-15369cac5bf0",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge=",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "87fa3f43-5155-42b4-a1ad-174c2595fdaf",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "8ef215a9-e8d5-43b3-9aa3-cb4333562e36",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "8f32efdc-f6fc-4c27-a3c2-579d109eff60",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "9edcf051-1cd0-44cc-bd2f-6ac21f0c24dd",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "e2150cdc-23ac-4940-a240-6c79c27ab029",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "ef18b06e-4700-4021-9949-ef783cd86be1",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge/self-service/browser/flows/registration?login_challenge=",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "ef18b06e-4700-4021-9949-ef783cd86be8",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration?login_challenge=",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"id": "f1b5ed18-113a-4a98-aae7-d4eba007199c",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "password",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"organization_id": null,
|
||||
"state": ""
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"id": "068f6bb6-d15f-436d-94f7-b3fd0489c9ef",
|
||||
"active": false,
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"authenticated_at": "2013-10-07T08:23:19Z",
|
||||
"authenticator_assurance_level": "aal2",
|
||||
"authentication_methods": [
|
||||
{
|
||||
"method": "password",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
},
|
||||
{
|
||||
"method": "totp",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
}
|
||||
],
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"identity": {
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"devices": []
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"id": "7458af86-c1d8-401c-978a-8da89133f78b",
|
||||
"active": true,
|
||||
"expires_at": "2080-10-07T08:23:19Z",
|
||||
"authenticated_at": "2013-10-07T08:23:19Z",
|
||||
"authenticator_assurance_level": "aal2",
|
||||
"authentication_methods": [
|
||||
{
|
||||
"method": "password",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
},
|
||||
{
|
||||
"method": "totp",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
}
|
||||
],
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"identity": {
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"devices": []
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"id": "7458af86-c1d8-401c-978a-8da89133f98b",
|
||||
"active": false,
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"authenticated_at": "2013-10-07T08:23:19Z",
|
||||
"authenticator_assurance_level": "aal2",
|
||||
"authentication_methods": [
|
||||
{
|
||||
"method": "password",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
},
|
||||
{
|
||||
"method": "totp",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
}
|
||||
],
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"identity": {
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"devices": [
|
||||
{
|
||||
"id": "884f556e-eb3a-4b9f-bee3-11763642c6c0",
|
||||
"ip_address": "54.155.246.232",
|
||||
"user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
|
||||
"location": "Munich, Germany"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"id": "8571e374-38f2-4f46-8ad3-b9d914e174d3",
|
||||
"active": false,
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"authenticated_at": "2013-10-07T08:23:19Z",
|
||||
"authenticator_assurance_level": "aal1",
|
||||
"authentication_methods": [
|
||||
{
|
||||
"method": "v0.6_legacy_session",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
}
|
||||
],
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"identity": {
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"devices": []
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"id": "dcde5aaa-f789-4d3d-ae1f-76da8d57e67c",
|
||||
"active": false,
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"authenticated_at": "2013-10-07T08:23:19Z",
|
||||
"authenticator_assurance_level": "aal1",
|
||||
"authentication_methods": [
|
||||
{
|
||||
"method": "v0.6_legacy_session",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
}
|
||||
],
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"identity": {
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"devices": []
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"id": "f38cdebe-e567-42c9-a562-1bd4dee40998",
|
||||
"active": false,
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"authenticated_at": "2013-10-07T08:23:19Z",
|
||||
"authenticator_assurance_level": "aal1",
|
||||
"authentication_methods": [
|
||||
{
|
||||
"method": "v0.6_legacy_session",
|
||||
"aal": "",
|
||||
"completed_at": "0001-01-01T00:00:00Z"
|
||||
}
|
||||
],
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"identity": {
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"devices": []
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"id": "194c5b05-0487-4a11-bcbc-f301c9ff9678",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "19ede218-928c-4e02-ab49-b76e12b34f31",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "19ede218-928c-4e02-ab49-b76e12b34f32",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "21c5f714-3089-49d2-b387-f244d4dd9e00",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"id": "74fd6c53-7651-453e-90b8-2c5adbf911bb",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "5ff66179-c240-4703-b0d8-494592cefff5",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "bazbar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "45e867e9-2745-4f16-8dd4-84334a252b61",
|
||||
"value": "foo@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "77fe4fb3-2d4e-4532-b568-c44b0aece0aa",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "8248bb5d-8ef7-45e3-8e07-9e2003dd5352",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "90b4f970-b9ae-42bc-a0a7-73ec750e0aa1",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "a79bfcf1-68ae-49de-8b23-4f96921b8341",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "aeba85bd-1a8c-44bf-8fc3-3be83c01a3dc",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"id": "cdfd1eed-34a4-491d-ad0a-7579d3a0a7ba",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/settings",
|
||||
"active": "profile",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"identity": {
|
||||
"id": "a251ebc2-880c-4f76-a8f3-38e6940eab0e",
|
||||
"schema_id": "default",
|
||||
"schema_url": "https://www.ory.sh/schemas/ZGVmYXVsdA",
|
||||
"state": "active",
|
||||
"traits": {
|
||||
"email": "foobar@ory.sh"
|
||||
},
|
||||
"verifiable_addresses": [
|
||||
{
|
||||
"id": "b2d59320-8564-4400-a39f-a22a497a23f1",
|
||||
"value": "foobar+without-code@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "c2427b6d-312b-46d9-9285-536db7ae11fd",
|
||||
"value": "foobar@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
},
|
||||
{
|
||||
"id": "d4718a67-aec2-418d-8173-6ebc7bde3b86",
|
||||
"value": "foobar+11345642c6c0@ory.sh",
|
||||
"verified": false,
|
||||
"via": "email",
|
||||
"status": "pending",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"recovery_addresses": [
|
||||
{
|
||||
"id": "b8293f1c-010f-45d9-b809-f3fc5365ba80",
|
||||
"value": "foobar@ory.sh",
|
||||
"via": "email",
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z"
|
||||
}
|
||||
],
|
||||
"metadata_public": null,
|
||||
"created_at": "2013-10-07T08:23:19Z",
|
||||
"updated_at": "2013-10-07T08:23:19Z",
|
||||
"organization_id": null
|
||||
},
|
||||
"state": "show_form",
|
||||
"organization_id": null
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "29b2c16e-2955-4faa-bd16-33af098cdf83",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "passed_challenge"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "3631e880-ce59-4cbd-a705-0d825eea590d",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "passed_challenge"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "42f31e47-65e1-4be9-80ea-e5d8ed64b236",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "passed_challenge"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"id": "5385c962-0295-4575-9b1b-d7eef13c0eda",
|
||||
"type": "browser",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/registration",
|
||||
"active": "link",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "choose_method"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "6aae3159-b880-4cfb-a863-03b114b1371b",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "show_form"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "7be6c72c-c868-4b61-a1f0-1130603665d1",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "show_form"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "7be6c72c-c868-4b61-a1f0-1130603665d8",
|
||||
"type": "api",
|
||||
"expires_at": "2013-10-07T08:23:19Z",
|
||||
"issued_at": "2013-10-07T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "show_form"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "81f74e5d-1fa5-4e1b-a9bf-e95119260471",
|
||||
"type": "api",
|
||||
"expires_at": "2022-11-03T08:23:19Z",
|
||||
"issued_at": "2022-11-03T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "show_form"
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"id": "81f74e5d-1fa5-4e1b-a9bf-e9511926047c",
|
||||
"type": "api",
|
||||
"expires_at": "2022-11-03T08:23:19Z",
|
||||
"issued_at": "2022-11-03T08:23:19Z",
|
||||
"request_url": "http://kratos:4433/self-service/browser/flows/verification/email",
|
||||
"ui": {
|
||||
"action": "",
|
||||
"method": "",
|
||||
"nodes": null
|
||||
},
|
||||
"state": "show_form"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user