linux-credentials / linux-credentials/credentialsd

Add DiscoverCredentials method

Offen
#136 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

enhancement
Vorherrschende Sprache
Rust
Sterne
259
Forks
19
Ø Merge
1 T. 2 Std.
Gemergte PRs (30 T.)
12

Beschreibung

In order to support autofill scenarios, we need to provide a method that allows a user to silently discover the existence of credentials.

Some considerations on the design:

  • should we allow cross-origin requests (probably specific to credential type)? Is that even meaningful?
  • what data should we return?

Prior art

WebAuthn

DiscoverableCredentialMetadata includes the following fields:

{
  "type": "public-key",
  "id": "credentialID",
  "rpId": "example.com"
  "userHandle": "abcdefghi1n",
  "otherUI": ??
}

Android

I have no idea how Android allows browsers to do credential discovery.
docs

Apple

Browser API:

platformCredentials(
    forRelyingParty relyingParty: String
) async -> [ASAuthorizationWebBrowserPlatformPublicKeyCredential]

struct ASAuthorizationWebBrowserPlatformPublicKeyCredential {
  /// A string the person can supply to describe this credential.
  let customTitle: String

  /// The user name for the account associated with this credential.
  let name: String

  /// The name of the app that manages this credential, or “iCloud Keychain” if it’s the operating system.
  let providerName: String

  /// The relying party that issues challenges for this credential.
  let relyingParty: String

  /// A unique identifier for the user account at the relying party.
  let userHandle: Data

  /// The identifier the operating system uses for this credential.  
  let credentialID: Data
}

Returns metadata for passkey. Returns credential ID, RP ID, user ID, user name and provider name.

docs

Credential provider side:

ASCredentialProviderViewController.prepareCredentialList(
    for: [ASCredentialServiceIdentifier],
    requestParameters: ASPasskeyCredentialRequestParameters
)

docs

Receives a list of "service identifiers" (URL, domain or app ID), which the credential provider should use to pull up a list of for display.

Windows

typedef struct _WEBAUTHN_CREDENTIAL_DETAILS {
    // Version of this structure, to allow for modifications in the future.
    DWORD dwVersion;

    // Size of pbCredentialID.
    DWORD cbCredentialID;
    _Field_size_bytes_(cbCredentialID)
    PBYTE pbCredentialID;

    // RP Info
    PWEBAUTHN_RP_ENTITY_INFORMATION     pRpInformation;

    // User Info
    PWEBAUTHN_USER_ENTITY_INFORMATION   pUserInformation;

    // Removable or not.
    BOOL bRemovable;

    //
    // The following fields have been added in WEBAUTHN_CREDENTIAL_DETAILS_VERSION_2
    //

    // Backed Up or not.
    BOOL bBackedUp;

    //
    // The following fields have been added in WEBAUTHN_CREDENTIAL_DETAILS_VERSION_3
    //
    PCWSTR pwszAuthenticatorName;

    // The logo is expected to be in the svg format
    DWORD cbAuthenticatorLogo;
    _Field_size_bytes_(cbAuthenticatorLogo)
    PBYTE pbAuthenticatorLogo;

    // ThirdPartyPayment Credential or not.
    BOOL bThirdPartyPayment;

    //
    // The following fields have been added in WEBAUTHN_CREDENTIAL_DETAILS_VERSION_4
    //

    // Applicable Transports
    DWORD dwTransports;

} WEBAUTHN_CREDENTIAL_DETAILS, *PWEBAUTHN_CREDENTIAL_DETAILS;
typedef const WEBAUTHN_CREDENTIAL_DETAILS *PCWEBAUTHN_CREDENTIAL_DETAILS;

typedef struct _WEBAUTHN_GET_CREDENTIALS_OPTIONS {
    // Version of this structure, to allow for modifications in the future.
    DWORD dwVersion;

    // Optional.
    LPCWSTR pwszRpId;

    // Optional. BrowserInPrivate Mode. Defaulting to FALSE.
    BOOL bBrowserInPrivateMode;
} WEBAUTHN_GET_CREDENTIALS_OPTIONS, *PWEBAUTHN_GET_CREDENTIALS_OPTIONS;
typedef const WEBAUTHN_GET_CREDENTIALS_OPTIONS *PCWEBAUTHN_GET_CREDENTIALS_OPTIONS;


HRESULT
WINAPI
WebAuthNGetPlatformCredentialList(
    _In_    PCWEBAUTHN_GET_CREDENTIALS_OPTIONS                  pGetCredentialsOptions,
    _Outptr_result_maybenull_ PWEBAUTHN_CREDENTIAL_DETAILS_LIST *ppCredentialDetailsList);

docs

Allows retrieving credential metadata by RP ID, with flag for browser private mode. Returns credential ID, RP ID, user ID and other information.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

In der Issue wird keine Quelldatei oder kein Test genannt. Beginne damit, die hier genannten WebAuthn-silent-discovery-Referenzen sowie die hier zitierten Credential-APIs von Android, Apple und Windows zu prüfen, und ermittle anschließend die Cross-Origin-Regeln, die zurückgegebenen Metadaten und den D-Bus-Methodenvertrag; als erledigt gilt die Aufgabe, wenn diese Designfragen in der vorgeschlagenen DiscoverCredentials API geklärt sind.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
linux, rust
Bereich
api, authentication, security
Issue-Typ
Feature
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.