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

This commit is contained in:
upstream-mirror
2026-09-15 21:19:12 +05:00
commit c60cc7ca75
8092 changed files with 394160 additions and 0 deletions

14
persistence/sql/.soda.yml Normal file
View 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
View 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).

View File

@@ -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(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
}

View File

@@ -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(?, ?, ?, ?, ?, ?, ?, ?)"
}

View File

@@ -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(?, ?, ?, ?, ?, ?, ?, ?)"
}

View File

@@ -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(?, ?, ?, ?, ?, ?, ?, ?)"
}

View File

@@ -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(?, ?, ?, ?, ?, ?, ?, ?)"
}

View File

@@ -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(?, ?, ?, ?, ?, ?, ?, ?, ?)"
}

View File

@@ -0,0 +1,10 @@
[
"2023-01-01T00:00:00Z",
"2023-01-01T00:00:00Z",
"string",
42,
null,
{
"foo": "bar"
}
]

View 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
}

View 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)
})
})
}

View 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
})
})
})
}
}

View 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))
}

View 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))
})
}
}

File diff suppressed because it is too large Load Diff

View 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)
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -0,0 +1,5 @@
{
"id": "f1f66a69-ce02-4a12-9591-9e02dda30a0d",
"expires_at": "2022-08-18T08:28:18Z",
"issued_at": "2022-08-18T07:28:18Z"
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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"
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": ""
}

View File

@@ -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": []
}

View File

@@ -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": []
}

View File

@@ -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"
}
]
}

View File

@@ -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": []
}

View File

@@ -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": []
}

View File

@@ -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": []
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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