onfido

package module
v1.0.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 26, 2023 License: MIT Imports: 19 Imported by: 7

README

go-onfido CircleCI Go Report Card

Client for the Onfido API

go-doc

This library was built for Utility Warehouse internal projects, so priority was given to supporting the features we needed. If the library is missing a feature from the API, raise an issue or ideally open a PR.

Installation

To install go-onfido, use go get:

go get github.com/uw-labs/go-onfido

Usage

First you're going to need to instantiate a client (grab your sandbox API key)

client := onfido.NewClient("test_123")

Or you can instantiate usign the env variable ONFIDO_TOKEN

client, err := onfido.NewClientFromEnv()

Now checkout some of the examples

Documentation

Index

Constants

View Source
const (
	BreakdownClear        BreakdownResult = "clear"
	BreakdownConsider     BreakdownResult = "consider"
	BreakdownUnidentified BreakdownResult = "unidentified"

	SubBreakdownClear        BreakdownSubResult = "clear"
	SubBreakdownConsider     BreakdownSubResult = "consider"
	SubBreakdownUnidentified BreakdownSubResult = "unidentified"
)
View Source
const (
	CheckStatusInProgress        CheckStatus = "in_progress"
	CheckStatusAwaitingApplicant CheckStatus = "awaiting_applicant"
	CheckStatusComplete          CheckStatus = "complete"
	CheckStatusWithdrawn         CheckStatus = "withdrawn"
	CheckStatusPaused            CheckStatus = "paused"
	CheckStatusReopened          CheckStatus = "reopened"

	CheckResultClear    CheckResult = "clear"
	CheckResultConsider CheckResult = "consider"
)

Supported check types

View Source
const (
	DocumentTypeUnknown        DocumentType = "unknown"
	DocumentTypePassport       DocumentType = "passport"
	DocumentTypeIDCard         DocumentType = "national_identity_card"
	DocumentTypeDrivingLicense DocumentType = "driving_licence"
	DocumentTypeUKBRP          DocumentType = "uk_biometric_residence_permit"
	DocumentTypeTaxID          DocumentType = "tax_id"
	DocumentTypeVoterID        DocumentType = "voter_id"

	DocumentSideFront DocumentSide = "front"
	DocumentSideBack  DocumentSide = "back"
)

Supported document types and sides

View Source
const (
	ClientVersion   = "0.1.0"
	DefaultEndpoint = "https://api.eu.onfido.com/v3.1"
	TokenEnv        = "ONFIDO_TOKEN"
)

Constants

View Source
const (
	ReportNameDocument                   ReportName = "document"
	ReportNameDocumentWithAddress        ReportName = "document_with_address_information"
	ReportNameDocumentWithDrivingLicense ReportName = "document_with_driving_licence_information"
	ReportNameFacialSimilarityPhoto      ReportName = "facial_similarity_photo"
	ReportNameFacialSimilarityVideo      ReportName = "facial_similarity_video"
	ReportNameKnownFaces                 ReportName = "known_faces"
	ReportNameIdentityEnhanced           ReportName = "identity_enhanced"
	ReportNameWatchlistEnhanced          ReportName = "watchlist_enhanced"
	ReportNameWatchlistStandard          ReportName = "watchlist_standard"
	ReportNameWatchlistPepsOnly          ReportName = "watchlist_peps_only"
	ReportNameWatchlistSanctionsOnly     ReportName = "watchlist_sanctions_only"
	ReportNameProofOfAddress             ReportName = "proof_of_address"
	ReportNameRightToWork                ReportName = "right_to_work"

	ReportResultClear        ReportResult = "clear"
	ReportResultConsider     ReportResult = "consider"
	ReportResultUnidentified ReportResult = "unidentified"

	ReportSubResultClear     ReportSubResult = "clear"
	ReportSubResultRejected  ReportSubResult = "rejected"
	ReportSubResultSuspected ReportSubResult = "suspected"
	ReportSubResultCaution   ReportSubResult = "caution"
)

Supported report names, results, subresults, and variants

View Source
const (
	WebhookSignatureHeader = "X-Sha2-Signature"
	WebhookTokenEnv        = "ONFIDO_WEBHOOK_TOKEN"
)

Constants

View Source
const (
	WebhookEnvironmentSandbox WebhookEnvironment = "sandbox"
	WebhookEnvironmentLive    WebhookEnvironment = "live"

	WebhookEventReportWithdrawn        WebhookEvent = "report.withdrawn"
	WebhookEventReportResumed          WebhookEvent = "report.resumed"
	WebhookEventReportCancelled        WebhookEvent = "report.cancelled"
	WebhookEventReportAwaitingApproval WebhookEvent = "report.awaiting_approval"
	WebhookEventReportInitiated        WebhookEvent = "report.initiated"
	WebhookEventReportCompleted        WebhookEvent = "report.completed"
	WebhookEventCheckStarted           WebhookEvent = "check.started"
	WebhookEventCheckReopened          WebhookEvent = "check.reopened"
	WebhookEventCheckWithdrawn         WebhookEvent = "check.withdrawn"
	WebhookEventCheckCompleted         WebhookEvent = "check.completed"
	WebhookEventCheckFormOpened        WebhookEvent = "check.form_opened"
	WebhookEventCheckFormCompleted     WebhookEvent = "check.form_completed"
)

Constants

Variables

View Source
var (
	ErrInvalidWebhookSignature = errors.New("invalid request, payload hash doesn't match signature")
	ErrMissingWebhookToken     = errors.New("webhook token not found in environmental variable")
)

Webhook errors

View Source
var (
	// ErrEmptyPostcode means that an empty postcode param was passed
	ErrEmptyPostcode = errors.New("empty postcode")
)

Functions

This section is empty.

Types

type Address

type Address struct {
	FlatNumber     string `json:"flat_number"`
	BuildingNumber string `json:"building_number"`
	BuildingName   string `json:"building_name"`
	Street         string `json:"street"`
	SubStreet      string `json:"sub_street"`
	Town           string `json:"town"`
	State          string `json:"state"`
	Postcode       string `json:"postcode"`
	Country        string `json:"country"`

	// Applicant specific
	StartDate string `json:"start_date,omitempty"`
	EndDate   string `json:"end_date,omitempty"`
}

Address represents an address from the Onfido API

type Addresses

type Addresses struct {
	Addresses []*Address `json:"addresses"`
}

Addresses represents a list of addresses from the Onfido API

type Applicant

type Applicant struct {
	ID         string     `json:"id,omitempty"`
	CreatedAt  *time.Time `json:"created_at,omitempty"`
	Sandbox    bool       `json:"sandbox,omitempty"`
	Title      string     `json:"title,omitempty"`
	FirstName  string     `json:"first_name,omitempty"`
	LastName   string     `json:"last_name,omitempty"`
	MiddleName string     `json:"middle_name,omitempty"`
	Email      string     `json:"email,omitempty"`
	DOB        string     `json:"dob,omitempty"`
	IDNumbers  []IDNumber `json:"id_numbers,omitempty"`
	Address    Address    `json:"address,omitempty"`
}

Applicant represents an applicant from the Onfido API

type ApplicantIter

type ApplicantIter struct {
	// contains filtered or unexported fields
}

ApplicantIter represents an applicant iterator

func (*ApplicantIter) Applicant

func (i *ApplicantIter) Applicant() *Applicant

Applicant returns the current applicant on the iterator.

func (ApplicantIter) Current

func (it ApplicantIter) Current() interface{}

func (ApplicantIter) Err

func (it ApplicantIter) Err() error

func (ApplicantIter) Next

func (it ApplicantIter) Next(ctx context.Context) bool

type Applicants

type Applicants struct {
	Applicants []*Applicant `json:"applicants"`
}

Applicants represents a list of applicants from the Onfido API

type Breakdown

type Breakdown struct {
	Result        *BreakdownResult `json:"result"`
	SubBreakdowns SubBreakdowns    `json:"breakdown"`
}

type BreakdownResult

type BreakdownResult string

BreakdownResult represents a report's breakdown result

type BreakdownSubResult

type BreakdownSubResult string

BreakdownSubResult represents a report's sub-breakdown result

type Breakdowns

type Breakdowns map[string]Breakdown

type Check

type Check struct {
	ID                    string      `json:"id,omitempty"`
	CreatedAt             *time.Time  `json:"created_at,omitempty"`
	Href                  string      `json:"href,omitempty"`
	Type                  CheckType   `json:"type,omitempty"`
	Status                CheckStatus `json:"status,omitempty"`
	Result                CheckResult `json:"result,omitempty"`
	DownloadURI           string      `json:"download_uri,omitempty"`
	FormURI               string      `json:"form_uri,omitempty"`
	RedirectURI           string      `json:"redirect_uri,omitempty"`
	ResultsURI            string      `json:"results_uri,omitempty"`
	Reports               []*Report   `json:"reports,omitempty"`
	Tags                  []string    `json:"tags,omitempty"`
	ApplicantID           string      `json:"applicant_id,omitempty"`
	ApplicantProvidesData bool        `json:"applicant_provides_data"`
}

Check represents a check in Onfido API

type CheckIter

type CheckIter struct {
	// contains filtered or unexported fields
}

CheckIter represents a check iterator

func (*CheckIter) Check

func (i *CheckIter) Check() *Check

Check returns the current item in the iterator as a Check.

func (CheckIter) Current

func (it CheckIter) Current() interface{}

func (CheckIter) Err

func (it CheckIter) Err() error

func (CheckIter) Next

func (it CheckIter) Next(ctx context.Context) bool

type CheckRequest

type CheckRequest struct {
	ApplicantID             string   `json:"applicant_id"`
	ReportNames             []string `json:"report_names"`
	RedirectURI             string   `json:"redirect_uri,omitempty"`
	Tags                    []string `json:"tags,omitempty"`
	SupressFormEmails       bool     `json:"suppress_form_emails,omitempty"`
	Async                   bool     `json:"asynchronous,omitempty"`
	ChargeApplicantForCheck bool     `json:"charge_applicant_for_check,omitempty"`
	// Consider is used for Sandbox Testing of multiple report scenarios.
	// see https://documentation.onfido.com/#sandbox-responses
	Consider              []ReportName `json:"consider,omitempty"`
	ApplicantProvidesData bool         `json:"applicant_provides_data"`
}

CheckRequest represents a check request to Onfido API

type CheckResult

type CheckResult string

CheckResult represents a result of a check (clear, consider)

type CheckRetrieved

type CheckRetrieved struct {
	ID                    string      `json:"id,omitempty"`
	CreatedAt             *time.Time  `json:"created_at,omitempty"`
	Href                  string      `json:"href,omitempty"`
	Type                  CheckType   `json:"type,omitempty"`
	Status                CheckStatus `json:"status,omitempty"`
	Result                CheckResult `json:"result,omitempty"`
	DownloadURI           string      `json:"download_uri,omitempty"`
	FormURI               string      `json:"form_uri,omitempty"`
	RedirectURI           string      `json:"redirect_uri,omitempty"`
	ResultsURI            string      `json:"results_uri,omitempty"`
	Reports               []string    `json:"reports,omitempty"`
	Tags                  []string    `json:"tags,omitempty"`
	ApplicantID           string      `json:"applicant_id,omitempty"`
	ApplicantProvidesData bool        `json:"applicant_provides_data"`
}

CheckRetrieved represents a check in the Onfido API which has been retrieved. This is subtly different to the Check type above, as the Reports slice is just a string of Report IDs, not fully expanded Report objects. See https://documentation.onfido.com/?shell#check-object (Shell)

type CheckStatus

type CheckStatus string

CheckStatus represents a status of a check

type CheckType

type CheckType string

CheckType represents a check type (express, standard)

type Checks

type Checks struct {
	Checks []*Check `json:"checks"`
}

Checks represents a list of checks in Onfido API

type Document

type Document struct {
	ID           string       `json:"id,omitempty"`
	CreatedAt    *time.Time   `json:"created_at,omitempty"`
	Href         string       `json:"href,omitempty"`
	DownloadHref string       `json:"download_href,omitempty"`
	FileName     string       `json:"file_name,omitempty"`
	FileType     string       `json:"file_type,omitempty"`
	FileSize     int          `json:"file_size,omitempty"`
	Type         DocumentType `json:"type,omitempty"`
	Side         DocumentSide `json:"side,omitempty"`
	ApplicantID  string       `json:"applicant_id,omitempty"`
}

Document represents a document in Onfido API

type DocumentDownload added in v1.0.2

type DocumentDownload struct {
	// Data is the binary data of the document
	Data []byte
}

type DocumentIter

type DocumentIter struct {
	// contains filtered or unexported fields
}

DocumentIter represents a document iterator

func (DocumentIter) Current

func (it DocumentIter) Current() interface{}

func (*DocumentIter) Document

func (i *DocumentIter) Document() *Document

Document returns the current item in the iterator as a Document.

func (DocumentIter) Err

func (it DocumentIter) Err() error

func (DocumentIter) Next

func (it DocumentIter) Next(ctx context.Context) bool

type DocumentProcessed added in v1.0.2

type DocumentProcessed map[string]interface{}

DocumentProcessed contains metadata about the document that has been processed

type DocumentRequest

type DocumentRequest struct {
	ApplicantID string
	File        io.ReadSeeker
	Type        DocumentType
	Side        DocumentSide
}

DocumentRequest represents a document request to Onfido API

type DocumentSide

type DocumentSide string

DocumentSide represents a document side (front, back)

type DocumentType

type DocumentType string

DocumentType represents a document type (passport, ID, etc)

type Documents

type Documents struct {
	Documents []*Document `json:"documents"`
}

Documents represents a list of documents from the Onfido API

type Error

type Error struct {
	Resp *http.Response
	// see https://documentation.onfido.com/#error-object
	Err struct {
		ID     string      `json:"id"`
		Type   string      `json:"type"`
		Msg    string      `json:"message"`
		Fields ErrorFields `json:"fields"`
	} `json:"error"`
}

Error represents an Onfido API error response

func (*Error) Error

func (e *Error) Error() string

type ErrorFields

type ErrorFields map[string]interface{}

known shapes of the values are []string and map[string][]string for recursive field validation

type HTTPRequester

type HTTPRequester interface {
	Do(*http.Request) (*http.Response, error)
}

HTTPRequester represents an HTTP requester

type IDNumber

type IDNumber struct {
	Type      IDNumberType `json:"type,omitempty"`
	Value     string       `json:"value,omitempty"`
	StateCode string       `json:"state_code,omitempty"`
}

IDNumber represents an ID number from the Onfido API

type IDNumberType

type IDNumberType string

IDNumberType represents an ID type (ssn, social insurance, etc)

const (
	IDNumberTypeSSN             IDNumberType = "ssn"
	IDNumberTypeSocialInsurance IDNumberType = "social_insurance"
	IDNumberTypeTaxID           IDNumberType = "tax_id"
	IDNumberTypeIdentityCard    IDNumberType = "identity_card"
	IDNumberTypeDrivingLicense  IDNumberType = "driving_licence"
)

Supported ID number types

type Iter added in v1.0.2

type Iter interface {
	Current() interface{}
	Err() error
	Next(ctx context.Context) bool
}

type LivePhoto

type LivePhoto struct {
	ID           string     `json:"id,omitempty"`
	CreatedAt    *time.Time `json:"created_at,omitempty"`
	Href         string     `json:"href,omitempty"`
	DownloadHref string     `json:"download_href,omitempty"`
	FileName     string     `json:"file_name,omitempty"`
	FileType     string     `json:"file_type,omitempty"`
	FileSize     int32      `json:"file_size,omitempty"`
}

LivePhoto represents a LivePhoto in Onfido API

type LivePhotoIter

type LivePhotoIter struct {
	// contains filtered or unexported fields
}

LivePhotoIter represents a LivePhoto iterator

func (LivePhotoIter) Current

func (it LivePhotoIter) Current() interface{}

func (LivePhotoIter) Err

func (it LivePhotoIter) Err() error

func (*LivePhotoIter) LivePhoto

func (i *LivePhotoIter) LivePhoto() *LivePhoto

LivePhoto returns the current item in the iterator as a LivePhoto.

func (LivePhotoIter) Next

func (it LivePhotoIter) Next(ctx context.Context) bool

type LiveVideo added in v1.0.2

type LiveVideo struct {
	ID           string     `json:"id,omitempty"`
	CreatedAt    *time.Time `json:"created_at,omitempty"`
	Href         string     `json:"href,omitempty"`
	DownloadHref string     `json:"download_href,omitempty"`
	FileName     string     `json:"file_name,omitempty"`
	FileType     string     `json:"file_type,omitempty"`
	FileSize     int        `json:"file_size,omitempty"`
}

LiveVideo represents a live video object in Onfido API https://documentation.onfido.com/#live-video-object

type LiveVideoDownload added in v1.0.2

type LiveVideoDownload struct {
	// Data is the binary data of the live video
	Data []byte
}

type LiveVideoIter added in v1.0.2

type LiveVideoIter interface {
	Iter
	LiveVideo() *LiveVideo
}

type OnfidoClient

type OnfidoClient interface {
	SetHTTPClient(client HTTPRequester)
	NewSdkTokenWeb(ctx context.Context, applicantID, referrer string) (*SdkToken, error)
	NewSdkTokenMobile(ctx context.Context, applicantID, applicationID string) (*SdkToken, error)
	GetReport(ctx context.Context, id string) (*Report, error)
	ResumeReport(ctx context.Context, id string) error
	CancelReport(ctx context.Context, id string) error
	ListReports(checkID string) *ReportIter
	GetDocument(ctx context.Context, id string) (*Document, error)
	ListDocuments(applicantID string) *DocumentIter
	UploadDocument(ctx context.Context, dr DocumentRequest) (*Document, error)
	DownloadDocument(ctx context.Context, id string) (*DocumentDownload, error)
	ListLivePhotos(applicantID string) *LivePhotoIter
	DownloadLiveVideo(ctx context.Context, id string) (*LiveVideoDownload, error)
	ListLiveVideos(applicantID string) LiveVideoIter
	CreateApplicant(ctx context.Context, a Applicant) (*Applicant, error)
	DeleteApplicant(ctx context.Context, id string) error
	GetApplicant(ctx context.Context, id string) (*Applicant, error)
	ListApplicants() *ApplicantIter
	UpdateApplicant(ctx context.Context, a Applicant) (*Applicant, error)
	CreateCheck(ctx context.Context, cr CheckRequest) (*Check, error)
	GetCheck(ctx context.Context, id string) (*CheckRetrieved, error)
	GetCheckExpanded(ctx context.Context, id string) (*Check, error)
	ResumeCheck(ctx context.Context, id string) (*Check, error)
	ListChecks(applicantID string) *CheckIter
	CreateWebhook(ctx context.Context, wr WebhookRefRequest) (*WebhookRef, error)
	UpdateWebhook(ctx context.Context, id string, wr WebhookRefRequest) (*WebhookRef, error)
	DeleteWebhook(ctx context.Context, id string) error
	ListWebhooks() *WebhookRefIter
	PickAddresses(postcode string) *PickerIter
	GetResource(ctx context.Context, href string, v interface{}) error
	Token() Token
}

func NewClient

func NewClient(token string, log *zap.Logger) OnfidoClient

NewClient creates a new Onfido client.

func NewClientFromEnv

func NewClientFromEnv() (OnfidoClient, error)

NewClientFromEnv creates a new Onfido client using configuration from environment variables.

type PickerIter

type PickerIter struct {
	// contains filtered or unexported fields
}

PickerIter represents an address picker iterator

func (*PickerIter) Address

func (i *PickerIter) Address() *Address

Address returns the current address on the iterator.

func (PickerIter) Current

func (it PickerIter) Current() interface{}

func (PickerIter) Err

func (it PickerIter) Err() error

func (PickerIter) Next

func (it PickerIter) Next(ctx context.Context) bool

type Properties

type Properties map[string]interface{}

type Report

type Report struct {
	ID         string                 `json:"id,omitempty"`
	Name       ReportName             `json:"name,omitempty"`
	CreatedAt  *time.Time             `json:"created_at,omitempty"`
	Status     string                 `json:"status,omitempty"`
	Result     ReportResult           `json:"result,omitempty"`
	SubResult  ReportSubResult        `json:"sub_result,omitempty"`
	Href       string                 `json:"href,omitempty"`
	Options    map[string]interface{} `json:"options,omitempty"`
	Breakdown  Breakdowns             `json:"breakdown,omitempty"`
	Properties Properties             `json:"properties,omitempty"`
	CheckID    string                 `json:"check_id,omitempty"`
	Documents  []DocumentProcessed    `json:"documents,omitempty"`
}

Report represents a report from the Onfido API

type ReportIter

type ReportIter struct {
	// contains filtered or unexported fields
}

ReportIter represents a document iterator

func (ReportIter) Current

func (it ReportIter) Current() interface{}

func (ReportIter) Err

func (it ReportIter) Err() error

func (ReportIter) Next

func (it ReportIter) Next(ctx context.Context) bool

func (*ReportIter) Report

func (i *ReportIter) Report() *Report

Report returns the current item in the iterator as a Report.

type ReportName

type ReportName string

ReportName represents a report type name

type ReportResult

type ReportResult string

ReportResult represents a report result

type ReportSubResult

type ReportSubResult string

ReportSubResult represents a report sub result

type Reports

type Reports struct {
	Reports []*Report `json:"reports"`
}

Reports represents a list of reports from the Onfido API

type SdkToken

type SdkToken struct {
	ApplicantID   string `json:"applicant_id,omitempty"`
	Referrer      string `json:"referrer,omitempty"`
	ApplicationID string `json:"application_id,omitempty"`
	Token         string `json:"token,omitempty"`
}

SdkToken represents the response for a request for a JWT token

type SubBreakdown

type SubBreakdown struct {
	Result     *BreakdownSubResult `json:"result"`
	Properties Properties          `json:"properties"`
}

type SubBreakdowns

type SubBreakdowns map[string]SubBreakdown

type Token

type Token string

Token is an Onfido authentication token

func (Token) Prod

func (t Token) Prod() bool

Prod checks if this is a production token or not.

func (Token) String

func (t Token) String() string

String returns the token as a string.

type Webhook

type Webhook interface {
	ValidateSignature(body []byte, signature string) error
	ParseFromRequest(req *http.Request) (*WebhookRequest, error)
}

func NewWebhook

func NewWebhook(token string) Webhook

NewWebhook creates a new webhook handler

func NewWebhookFromEnv

func NewWebhookFromEnv() (Webhook, error)

NewWebhookFromEnv creates a new webhook handler using configuration from environment variables.

type WebhookEnvironment

type WebhookEnvironment string

WebhookEnvironment represents an environment type (see `WebhookEnvironment*` constants for possible values)

type WebhookEvent

type WebhookEvent string

WebhookEvent represents an event type (see `WebhookEvent*` constants for possible values)

type WebhookRef

type WebhookRef struct {
	ID           string               `json:"id,omitempty"`
	URL          string               `json:"url,omitempty"`
	Enabled      bool                 `json:"enabled"`
	Href         string               `json:"href,omitempty"`
	Token        string               `json:"token,omitempty"`
	Environments []WebhookEnvironment `json:"environments,omitempty"`
	Events       []WebhookEvent       `json:"events,omitempty"`
}

WebhookRef represents a webhook in Onfido API

type WebhookRefIter

type WebhookRefIter struct {
	// contains filtered or unexported fields
}

WebhookRefIter represents a webhook iterator

func (WebhookRefIter) Current

func (it WebhookRefIter) Current() interface{}

func (WebhookRefIter) Err

func (it WebhookRefIter) Err() error

func (WebhookRefIter) Next

func (it WebhookRefIter) Next(ctx context.Context) bool

func (*WebhookRefIter) WebhookRef

func (i *WebhookRefIter) WebhookRef() *WebhookRef

WebhookRef returns the current item in the iterator as a WebhookRef.

type WebhookRefRequest

type WebhookRefRequest struct {
	URL          string               `json:"url"` // Onfido requires that this must be HTTPS
	Enabled      bool                 `json:"enabled"`
	Environments []WebhookEnvironment `json:"environments,omitempty"` // If omitted then Onfido will default to both
	Events       []WebhookEvent       `json:"events,omitempty"`       // If omitted then Onfido will default to all
}

WebhookRefRequest represents a webhook request to Onfido API

type WebhookRefs

type WebhookRefs struct {
	WebhookRefs []*WebhookRef `json:"webhooks"`
}

WebhookRefs represents a list of webhooks in Onfido API

type WebhookRequest

type WebhookRequest struct {
	Payload struct {
		ResourceType string `json:"resource_type"`
		Action       string `json:"action"`
		Object       struct {
			ID          string `json:"id"`
			Status      string `json:"status"`
			CompletedAt string `json:"completed_at_iso8601"`
			Href        string `json:"href"`
		} `json:"object"`
	} `json:"payload"`
}

WebhookRequest represents an incoming webhook request from Onfido

Directories

Path Synopsis
examples
jwt

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL