Notoriously Psychedelic Modules

    @auth0/fga
    TypeScript icon, indicating that this package has built-in type declarations

    0.7.0 • Public • Published

    JavaScript and Node.js SDK for Auth0 Fine Grained Authorization (FGA)

    FOSSA Status

    This is an autogenerated JavaScript SDK for Auth0 Fine Grained Authorization (FGA). It provides a wrapper around the Auth0 Fine Grained Authorization API, and includes TS typings.

    Warning: This SDK comes with no SLAs and is not production-ready!

    Table of Contents

    About Auth0 Fine Grained Authorization (FGA)

    Auth0 Fine Grained Authorization (FGA) is an open source Fine-Grained Authorization solution inspired by Google's Zanzibar paper. It was created by the FGA team at Auth0 based on Auth0 Fine-Grained Authorization (FGA), available under a permissive license (Apache-2) and welcomes community contributions.

    Auth0 Fine Grained Authorization (FGA) is designed to make it easy for application builders to model their permission layer, and to add and integrate fine-grained authorization into their applications. Auth0 Fine Grained Authorization (FGA)’s design is optimized for reliability and low latency at a high scale.

    It allows in-memory data storage for quick development, as well as pluggable database modules - with initial support for PostgreSQL.

    It offers an HTTP API and has SDKs for programming languages including Node.js/JavaScript, GoLang and .NET.

    More SDKs and integrations such as Rego are planned for the future.

    Resources

    Installation

    Using npm:

    npm install @auth0/fga

    Using yarn:

    yarn add @auth0/fga

    Getting Started

    Initializing the API Client

    const { Auth0FgaApi } = require('@auth0/fga'); // OR import { Auth0FgaApi } from '@auth0/fga';
    
    // See https://github.com/auth0-lab/fga-js-sdk#getting-your-store-id-client-id-and-client-secret
    const auth0Fga = new Auth0FgaApi({
      environment: AUTH0_FGA_ENVIRONMENT, // can be: "us"/"staging"/"playground"
      storeId: AUTH0_FGA_STORE_ID,
      clientId: AUTH0_FGA_CLIENT_ID, // Required for all environments except playground
      clientSecret: AUTH0_FGA_CLIENT_SECRET, // Required for all environments except playground
    });

    Getting your Store ID, Client ID and Client Secret

    Production

    Make sure you have created your credentials on the Auth0 FGA Dashboard. Learn how

    You will need to set the AUTH0_FGA_ENVIRONMENT variable to "us". Provide the store id, client id and client secret you have created on the Dashboard.

    Playground

    If you are testing this on the public playground, you need to set your AUTH0_FGA_ENVIRONMENT to "playground".

    To get your store id, you may copy it from the store you have created on the Playground. Learn how

    In the playground environment, you do not need to provide a client id and client secret.

    Calling the API

    Write Authorization Model

    API Documentation

    Note: To learn how to build your authorization model, check the Docs at https://docs.fga.dev.

    Learn more about the Auth0 Fine Grained Authorization (FGA) configuration language.

    const { authorization_model_id: id } = await auth0Fga.writeAuthorizationModel({
      type_definitions: [{
        type: "document",
        relations: {
          "writer": { "this": {} },
          "viewer": {
            "union": {
              "child": [
                { "this": {} },
                { "computedUserset": {
                   "object": "",
                  "relation": "viewer" }
                }
              ]
            }
          }
        } }],
    });
    
    // id = "1uHxCSuTP0VKPYSnkq1pbb1jeZw"

    Read a Single Authorization Model

    API Documentation

    // Assuming `1uHxCSuTP0VKPYSnkq1pbb1jeZw` is an id of a single model
    const { authorization_model: authorizationModel } = await auth0Fga.readAuthorizationModel('1uHxCSuTP0VKPYSnkq1pbb1jeZw');
    
    // authorizationModel = { id: "1uHxCSuTP0VKPYSnkq1pbb1jeZw", type_definitions: [...] }

    Read Authorization Model IDs

    API Documentation

    const { authorization_model_ids: authorizationModelIds } = await auth0Fga.readAuthorizationModels();
    
    // authorizationModelIds = ["1uHxCSuTP0VKPYSnkq1pbb1jeZw", "GtQpMohWezFmIbyXxVEocOCxxgq"];

    Check

    API Documentation

    Provide a tuple and ask the Auth0 Fine Grained Authorization (FGA) API to check for a relationship

    const result = await auth0Fga.check({
      tuple_key: {
        user: "81684243-9356-4421-8fbf-a4f8d36aa31b",
        relation: "admin",
        object: "workspace:675bcac4-ad38-4fb1-a19a-94a5648c91d6",
      },
    });
    
    // result = { allowed: true, resolution: "" }

    Write Tuples

    API Documentation

    await auth0Fga.write({
      writes: {
        tuple_keys: [{ user: "anne", relation: "viewer", object: "document:roadmap" }],
      },
    });

    Delete Tuples

    API Documentation

    await auth0Fga.write({
      deletes: {
        tuple_keys: [{ user: "anne", relation: "viewer", object: "document:roadmap" }],
      },
    });

    Expand

    API Documentation

    const { tree } = await auth0Fga.expand({
      tuple_key: {
        relation: "admin",
        object: "workspace:675bcac4-ad38-4fb1-a19a-94a5648c91d6",
      },
    });
    
    // tree  = { root: { name: "workspace:675bcac4-ad38-4fb1-a19a-94a5648c91d6#admin", leaf: { users: { users: ["anne", "beth"] } } } }

    Read

    API Documentation

    // Find if a relationship tuple stating that a certain user is an admin on a certain workspace
    const body = {
      tuple_key: {
        user: "81684243-9356-4421-8fbf-a4f8d36aa31b",
        relation: "admin",
        object: "workspace:675bcac4-ad38-4fb1-a19a-94a5648c91d6",
      },
    };
    
    // Find all relationship tuples where a certain user has a relationship as any relation to a certain workspace
    const body = {
      tuple_key: {
        user: "81684243-9356-4421-8fbf-a4f8d36aa31b",
        object: "workspace:675bcac4-ad38-4fb1-a19a-94a5648c91d6",
      },
    };
    
    // Find all relationship tuples where a certain user is an admin on any workspace
    const body = {
      tuple_key: {
        user: "81684243-9356-4421-8fbf-a4f8d36aa31b",
        relation: "admin",
        object: "workspace:",
      },
    };
    
    // Find all relationship tuples where any user has a relationship as any relation with a particular workspace
    const body = {
      tuple_key: {
        object: "workspace:675bcac4-ad38-4fb1-a19a-94a5648c91d6",
      },
    };
    
    const { tuples } = await auth0Fga.read(body);
    
    // In all the above situations, the response will be of the form:
    // tuples = [{ key: { user, relation, object }, timestamp: ... }]

    Read Changes (Watch)

    API Documentation

    const type = 'workspace';
    const pageSize = 25;
    const continuationToken = 'eyJwayI6IkxBVEVTVF9OU0NPTkZJR19hdXRoMHN0b3JlIiwic2siOiIxem1qbXF3MWZLZExTcUoyN01MdTdqTjh0cWgifQ==';
    const response = await auth0Fga.readChanges(type, pageSize, continuationToken);
    
    // response.continuation_token = ...
    // response.changes = [
    //   { tuple_key: { user, relation, object }, operation: "write", timestamp: ... },
    //   { tuple_key: { user, relation, object }, operation: "delete", timestamp: ... }
    // ]

    API Endpoints

    Method HTTP request Description
    check POST /stores/{store_id}/check Check whether a user is authorized to access an object
    expand POST /stores/{store_id}/expand Expand all relationships in userset tree format, and following userset rewrite rules. Useful to reason about and debug a certain relationship
    read POST /stores/{store_id}/read Get tuples from the store that matches a query, without following userset rewrite rules
    readAssertions GET /stores/{store_id}/assertions/{authorization_model_id} Read assertions for an authorization model ID
    readAuthorizationModel GET /stores/{store_id}/authorization-models/{id} Return a particular version of an authorization model
    readAuthorizationModels GET /stores/{store_id}/authorization-models Return all the authorization model IDs for a particular store
    readChanges GET /stores/{store_id}/changes Return a list of all the tuple changes
    write POST /stores/{store_id}/write Add or delete tuples from the store
    writeAssertions PUT /stores/{store_id}/assertions/{authorization_model_id} Upsert assertions for an authorization model ID
    writeAuthorizationModel POST /stores/{store_id}/authorization-models Create a new authorization model

    check

    Name Type Description Notes
    body CheckRequest
    Return type

    CheckResponse

    expand

    Name Type Description Notes
    body ExpandRequest
    Return type

    ExpandResponse

    read

    Name Type Description Notes
    body ReadRequest
    Return type

    ReadResponse

    readAssertions

    Name Type Description Notes
    authorizationModelId string [default to undefined]
    Return type

    ReadAssertionsResponse

    readAuthorizationModel

    Name Type Description Notes
    id string [default to undefined]
    Return type

    ReadAuthorizationModelResponse

    readAuthorizationModels

    Name Type Description Notes
    pageSize number [default to undefined]
    Return type

    ReadAuthorizationModelsResponse

    readChanges

    Name Type Description Notes
    type string [default to undefined]
    Return type

    ReadChangesResponse

    write

    Name Type Description Notes
    body WriteRequest
    Return type

    object

    writeAssertions

    Name Type Description Notes
    authorizationModelId string [default to undefined]
    Return type

    (empty response body)

    writeAuthorizationModel

    Name Type Description Notes
    typeDefinitions TypeDefinitions
    Return type

    WriteAuthorizationModelResponse

    Models

    Any

    Properties
    Name Type Description Notes
    type string [optional] [default to undefined]

    Assertion

    Properties
    Name Type Description Notes
    tuple_key TupleKey [optional] [default to undefined]
    expectation boolean [default to undefined]

    AuthErrorCode

    Enum
    • NoAuthError (value: 'no_auth_error')

    • AuthFailure (value: 'auth_failure')

    • AuthFailedInvalidSubject (value: 'auth_failed_invalid_subject')

    • AuthFailedInvalidAudience (value: 'auth_failed_invalid_audience')

    • AuthFailedInvalidIssuer (value: 'auth_failed_invalid_issuer')

    • InvalidClaims (value: 'invalid_claims')

    • AuthFailedInvalidBearerToken (value: 'auth_failed_invalid_bearer_token')

    • MissingCustomerInBearerToken (value: 'missing_customer_in_bearer_token')

    • MissingStoreInBearerToken (value: 'missing_store_in_bearer_token')

    • StoreMismatchInBearerToken (value: 'store_mismatch_in_bearer_token')

    • CustomerMismatchInBearerToken (value: 'customer_mismatch_in_bearer_token')

    • BearerTokenMissing (value: 'bearer_token_missing')

    • Unauthenticated (value: 'unauthenticated')

    • InsufficientPermissions (value: 'insufficient_permissions')

    • UnauthorizedPrincipal (value: 'unauthorized_principal')

    AuthenticationErrorMessageResponse

    Properties
    Name Type Description Notes
    code AuthErrorCode [optional] [default to undefined]
    message string [optional] [default to undefined]

    AuthorizationModel

    Properties
    Name Type Description Notes
    id string [optional] [default to undefined]
    type_definitions TypeDefinition[] [optional] [default to undefined]

    CheckRequest

    Properties
    Name Type Description Notes
    tuple_key TupleKey [optional] [default to undefined]
    contextual_tuples ContextualTupleKeys [optional] [default to undefined]
    authorization_model_id string [optional] [default to undefined]
    trace boolean Defaults to false. Making it true has performance implications. [optional] [readonly] [default to undefined]

    CheckResponse

    Properties
    Name Type Description Notes
    allowed boolean [optional] [default to undefined]
    resolution string For internal use only. [optional] [default to undefined]

    Computed

    Properties
    Name Type Description Notes
    userset string [optional] [default to undefined]

    ContextualTupleKeys

    Properties
    Name Type Description Notes
    tuple_keys TupleKey[] [default to undefined]

    CreateStoreResponse

    Properties
    Name Type Description Notes
    id string [optional] [default to undefined]
    name string [optional] [default to undefined]
    created_at string [optional] [default to undefined]
    updated_at string [optional] [default to undefined]

    Difference

    Properties
    Name Type Description Notes
    base Userset [optional] [default to undefined]
    subtract Userset [optional] [default to undefined]

    ErrorCode

    Enum
    • NoError (value: 'no_error')

    • ValidationError (value: 'validation_error')

    • AuthorizationModelNotFound (value: 'authorization_model_not_found')

    • AuthorizationModelResolutionTooComplex (value: 'authorization_model_resolution_too_complex')

    • InvalidWriteInput (value: 'invalid_write_input')

    • CannotAllowDuplicateTuplesInOneRequest (value: 'cannot_allow_duplicate_tuples_in_one_request')

    • CannotAllowDuplicateTypesInOneRequest (value: 'cannot_allow_duplicate_types_in_one_request')

    • CannotAllowMultipleReferencesToOneRelation (value: 'cannot_allow_multiple_references_to_one_relation')

    • InvalidContinuationToken (value: 'invalid_continuation_token')

    • InvalidTupleSet (value: 'invalid_tuple_set')

    • InvalidCheckInput (value: 'invalid_check_input')

    • InvalidExpandInput (value: 'invalid_expand_input')

    • UnsupportedUserSet (value: 'unsupported_user_set')

    • InvalidObjectFormat (value: 'invalid_object_format')

    • TokenIssuerAlreadyRegistered (value: 'token_issuer_already_registered')

    • TosAgreementAlreadySigned (value: 'tos_agreement_already_signed')

    • WriteFailedDueToInvalidInput (value: 'write_failed_due_to_invalid_input')

    • AuthorizationModelAssertionsNotFound (value: 'authorization_model_assertions_not_found')

    • LatestAuthorizationModelNotFound (value: 'latest_authorization_model_not_found')

    • TypeNotFound (value: 'type_not_found')

    • RelationNotFound (value: 'relation_not_found')

    • EmptyRelationDefinition (value: 'empty_relation_definition')

    • InvalidUser (value: 'invalid_user')

    • InvalidTokenIssuer (value: 'invalid_token_issuer')

    • InvalidTuple (value: 'invalid_tuple')

    • UnknownRelation (value: 'unknown_relation')

    • StoreIdInvalidLength (value: 'store_id_invalid_length')

    • IssuerUrlInvalidUri (value: 'issuer_url_invalid_uri')

    • IssuerUrlRequiredAbsolutePath (value: 'issuer_url_required_absolute_path')

    • AssertionsTooManyItems (value: 'assertions_too_many_items')

    • IdTooLong (value: 'id_too_long')

    • InvalidEnvironment (value: 'invalid_environment')

    • AuthorizationModelIdTooLong (value: 'authorization_model_id_too_long')

    • TupleKeyValueNotSpecified (value: 'tuple_key_value_not_specified')

    • TupleKeysTooManyOrTooFewItems (value: 'tuple_keys_too_many_or_too_few_items')

    • PageSizeInvalid (value: 'page_size_invalid')

    • ParamMissingValue (value: 'param_missing_value')

    • DifferenceBaseMissingValue (value: 'difference_base_missing_value')

    • SubtractBaseMissingValue (value: 'subtract_base_missing_value')

    • ObjectTooLong (value: 'object_too_long')

    • RelationTooLong (value: 'relation_too_long')

    • TypeDefinitionsTooFewItems (value: 'type_definitions_too_few_items')

    • TypeInvalidLength (value: 'type_invalid_length')

    • TypeInvalidPattern (value: 'type_invalid_pattern')

    • RelationsTooFewItems (value: 'relations_too_few_items')

    • RelationsTooLong (value: 'relations_too_long')

    • RelationsInvalidPattern (value: 'relations_invalid_pattern')

    • ObjectInvalidPattern (value: 'object_invalid_pattern')

    • QueryStringTypeContinuationTokenMismatch (value: 'query_string_type_continuation_token_mismatch')

    • ExceededEntityLimit (value: 'exceeded_entity_limit')

    • InvalidContextualTuple (value: 'invalid_contextual_tuple')

    • DuplicateContextualTuple (value: 'duplicate_contextual_tuple')

    ExpandRequest

    Properties
    Name Type Description Notes
    tuple_key TupleKey [optional] [default to undefined]
    authorization_model_id string [optional] [default to undefined]

    ExpandResponse

    Properties
    Name Type Description Notes
    tree UsersetTree [optional] [default to undefined]

    GetStoreResponse

    Properties
    Name Type Description Notes
    id string [optional] [default to undefined]
    name string [optional] [default to undefined]
    created_at string [optional] [default to undefined]
    updated_at string [optional] [default to undefined]

    InternalErrorCode

    Enum
    • NoInternalError (value: 'no_internal_error')

    • InternalError (value: 'internal_error')

    • AuthInternalError (value: 'auth_internal_error')

    • AuthFailedErrorFetchingWellKnownJwks (value: 'auth_failed_error_fetching_well_known_jwks')

    • Cancelled (value: 'cancelled')

    • DeadlineExceeded (value: 'deadline_exceeded')

    • AlreadyExists (value: 'already_exists')

    • ResourceExhausted (value: 'resource_exhausted')

    • FailedPrecondition (value: 'failed_precondition')

    • Aborted (value: 'aborted')

    • OutOfRange (value: 'out_of_range')

    • Unavailable (value: 'unavailable')

    • DataLoss (value: 'data_loss')

    InternalErrorMessageResponse

    Properties
    Name Type Description Notes
    code InternalErrorCode [optional] [default to undefined]
    message string [optional] [default to undefined]

    Leaf

    Properties
    Name Type Description Notes
    users Users [optional] [default to undefined]
    computed Computed [optional] [default to undefined]
    tupleToUserset UsersetTreeTupleToUserset [optional] [default to undefined]

    ListStoresResponse

    Properties
    Name Type Description Notes
    stores Store[] [optional] [default to undefined]
    continuation_token string [optional] [default to undefined]

    Node

    Properties
    Name Type Description Notes
    name string [optional] [default to undefined]
    leaf Leaf [optional] [default to undefined]
    difference UsersetTreeDifference [optional] [default to undefined]
    union Nodes [optional] [default to undefined]
    intersection Nodes [optional] [default to undefined]

    Nodes

    Properties
    Name Type Description Notes
    nodes Node[] [optional] [default to undefined]

    NotFoundErrorCode

    Enum
    • NoNotFoundError (value: 'no_not_found_error')

    • UndefinedEndpoint (value: 'undefined_endpoint')

    • CustomerIdNotFound (value: 'customer_id_not_found')

    • StoreIdNotFound (value: 'store_id_not_found')

    • StoreClientIdNotFound (value: 'store_client_id_not_found')

    • ResourceNotFound (value: 'resource_not_found')

    • Unimplemented (value: 'unimplemented')

    ObjectRelation

    Properties
    Name Type Description Notes
    object string [optional] [default to undefined]
    relation string [optional] [default to undefined]

    PathUnknownErrorMessageResponse

    Properties
    Name Type Description Notes
    code NotFoundErrorCode [optional] [default to undefined]
    message string [optional] [default to undefined]

    ReadAssertionsResponse

    Properties
    Name Type Description Notes
    authorization_model_id string [optional] [default to undefined]
    assertions Assertion[] [optional] [default to undefined]

    ReadAuthorizationModelResponse

    Properties
    Name Type Description Notes
    authorization_model AuthorizationModel [optional] [default to undefined]

    ReadAuthorizationModelsResponse

    Properties
    Name Type Description Notes
    authorization_models AuthorizationModel[] [optional] [default to undefined]
    continuation_token string [optional] [default to undefined]

    ReadChangesResponse

    Properties
    Name Type Description Notes
    changes TupleChange[] [optional] [default to undefined]
    continuation_token string [optional] [default to undefined]

    ReadRequest

    Properties
    Name Type Description Notes
    tuple_key TupleKey [optional] [default to undefined]
    authorization_model_id string [optional] [default to undefined]
    page_size number [optional] [default to undefined]
    continuation_token string [optional] [default to undefined]

    ReadResponse

    Properties
    Name Type Description Notes
    tuples Tuple[] [optional] [default to undefined]
    continuation_token string [optional] [default to undefined]

    ResourceExhaustedErrorCode

    Enum
    • NoResourceExhaustedError (value: 'no_resource_exhausted_error')

    • RateLimitExceeded (value: 'rate_limit_exceeded')

    • AuthRateLimitExceeded (value: 'auth_rate_limit_exceeded')

    ResourceExhaustedErrorMessageResponse

    Properties
    Name Type Description Notes
    code ResourceExhaustedErrorCode [optional] [default to undefined]
    message string [optional] [default to undefined]

    Status

    Properties
    Name Type Description Notes
    code number [optional] [default to undefined]
    message string [optional] [default to undefined]
    details Any[] [optional] [default to undefined]

    Store

    Properties
    Name Type Description Notes
    id string [optional] [default to undefined]
    name string [optional] [default to undefined]
    created_at string [optional] [default to undefined]
    updated_at string [optional] [default to undefined]
    deleted_at string [optional] [default to undefined]

    Tuple

    Properties
    Name Type Description Notes
    key TupleKey [optional] [default to undefined]
    timestamp string [optional] [default to undefined]

    TupleChange

    Properties
    Name Type Description Notes
    tuple_key TupleKey [optional] [default to undefined]
    operation TupleOperation [optional] [default to undefined]
    timestamp string [optional] [default to undefined]

    TupleKey

    Properties
    Name Type Description Notes
    object string [optional] [default to undefined]
    relation string [optional] [default to undefined]
    user string [optional] [default to undefined]

    TupleKeys

    Properties
    Name Type Description Notes
    tuple_keys TupleKey[] [default to undefined]

    TupleOperation

    Enum
    • Write (value: 'TUPLE_OPERATION_WRITE')

    • Delete (value: 'TUPLE_OPERATION_DELETE')

    TupleToUserset

    Properties
    Name Type Description Notes
    tupleset ObjectRelation [optional] [default to undefined]
    computedUserset ObjectRelation [optional] [default to undefined]

    TypeDefinition

    Properties
    Name Type Description Notes
    type string [default to undefined]
    relations Record<string, Userset> [default to undefined]

    TypeDefinitions

    Properties
    Name Type Description Notes
    type_definitions TypeDefinition[] [optional] [default to undefined]

    Users

    Properties
    Name Type Description Notes
    users string [optional] [default to undefined]

    Userset

    Properties
    Name Type Description Notes
    this object A DirectUserset is a sentinel message for referencing the direct members specified by an object/relation mapping. [optional] [default to undefined]
    computedUserset ObjectRelation [optional] [default to undefined]
    tupleToUserset TupleToUserset [optional] [default to undefined]
    union Usersets [optional] [default to undefined]
    intersection Usersets [optional] [default to undefined]
    difference Difference [optional] [default to undefined]

    UsersetTree

    Properties
    Name Type Description Notes
    root Node [optional] [default to undefined]

    UsersetTreeDifference

    Properties
    Name Type Description Notes
    base Node [optional] [default to undefined]
    subtract Node [optional] [default to undefined]

    UsersetTreeTupleToUserset

    Properties
    Name Type Description Notes
    tupleset string [optional] [default to undefined]
    computed Computed[] [optional] [default to undefined]

    Usersets

    Properties
    Name Type Description Notes
    child Userset[] [optional] [default to undefined]

    ValidationErrorMessageResponse

    Properties
    Name Type Description Notes
    code ErrorCode [optional] [default to undefined]
    message string [optional] [default to undefined]

    WriteAssertionsRequest

    Properties
    Name Type Description Notes
    assertions Assertion[] [default to undefined]

    WriteAuthorizationModelResponse

    Properties
    Name Type Description Notes
    authorization_model_id string [optional] [default to undefined]

    WriteRequest

    Properties
    Name Type Description Notes
    writes TupleKeys [optional] [default to undefined]
    deletes TupleKeys [optional] [default to undefined]
    authorization_model_id string [optional] [default to undefined]

    Contributing

    Issues

    If you have found a bug or if you have a feature request, please report them at this repository issues section. Please do not report security vulnerabilities on the public GitHub issue tracker.

    Pull Requests

    Pull Requests are not currently open, please raise an issue or contact a team member on https://discord.gg/8naAwJfWN6 if there is a feature you'd like us to implement.

    Author

    Auth0 FGA

    License

    This project is licensed under the MIT license. See the LICENSE file for more info.

    The code in this repo was auto generated by OpenAPI Generator from a template based on the typescript-axios template and go template, licensed under the Apache License 2.0.

    Install

    npm i @auth0/fga

    DownloadsWeekly Downloads

    211

    Version

    0.7.0

    License

    MIT

    Unpacked Size

    287 kB

    Total Files

    20

    Last publish

    Collaborators

    • willvedd
    • david.renaud.okta
    • jeff.shuman
    • cristian.j.gonzalez
    • auth0-oss
    • codepete
    • ziluvatar
    • iaco
    • cocojoe
    • fyockm
    • auth0npm
    • auth0alec
    • auth0brokkr
    • hzalaz
    • glena
    • aaguiarz
    • charlesrea
    • lbalmaceda
    • jstrutz
    • julien.wollscheid
    • cristiandouce
    • heyitsry
    • sambego
    • stevehobbsdev
    • davidmoses
    • sandrinodimattia
    • lzychowski
    • joshcanhelp
    • rob.coles
    • faroceann
    • rosnovsky
    • davidpatrick0
    • widcket
    • adamjmcgrath
    • ldoorz
    • th3maio
    • jim.andersoon
    • fadymak
    • navrupt
    • frederikprijck
    • sergii.biienko
    • tomauth0
    • jakewlacey
    • jpadilla
    • jessele
    • shushen
    • rhamzeh_auth0
    • greglopez