يعد تطبيق الويب هذا عرضًا تجريبيًا لمكتبة WebAuthn Server (FXAmacker/Webauthn). وهو يدعم التسجيل والمصادقة على Webauthn. ينفذ API المقترح لخوادم FIDO2.

WebAuthn (مصادقة الويب) هو معيار ويب W3C لمصادقة المستخدمين على التطبيقات والخدمات المستندة إلى الويب. إنه مكون أساسي لـ FIDO2 ، خليفة بروتوكول Fido U2F Legacy.
هذا العرض التوضيحي ليس للاستخدام الإنتاج لأنه مصمم ليكون عرضًا تجريبيًا.
go get github.com/fxamacker/webauthn-demo
$ CERTS_DIR=[folder containing cert.pem and key.pem] docker-compose up
يعمل Webauthn Demo على https: // localhost: 8443 على مضيف Docker الخاص بك.
$ docker-compose up
يعمل Webauthn Demo على https: // localhost: 8443 على مضيف Docker الخاص بك.
تتكون عملية التسجيل من خطوتين: إنشاء خيارات إنشاء بيانات الاعتماد وتسجيل بيانات الاعتماد. راجع Signup.html و Webauthn.register.js و registration_handlers.go.
إنشاء خيارات إنشاء بيانات الاعتماد:
طلب الخادم /attestation/options عن طريق إرجاع خيارات إنشاء بيانات الاعتماد (PublicKeyCredentialCreationOptions) إلى العميل. ثم يستخدم العميل هذه الخيارات مع navigator.credentials.create() لإنشاء بيانات اعتماد جديدة.
// Simplified `/attestation/options` handler from registration_handlers.go
func (s *server) handleAttestationOptions(w http.ResponseWriter, r *http.Request) {
// Get user from datastore by username.
u, _ := s.dataStore.getUser(r.Context(), optionsRequest.Username)
// Create PublicKeyCredentialCreationOptions using webauthn library.
creationOptions, _ := webauthn.NewAttestationOptions(s.webAuthnConfig, &webauthn.User{ID: u.UserID, Name: u.UserName, DisplayName: u.DisplayName, CredentialIDs: u.CredentialIDs})
// Save creationOptions and user info in session to verify new credential later.
session.Values[WebAuthnCreationOptions] = creationOptions
session.Values[UserSession] = &userSession{User: u}
// Write creationOptions to response.
}
سجل بيانات الاعتماد:
يتحقق الخادم ويسجل بيانات اعتماد جديدة تم استلامها عبر /attestation/result .
// Simplified `/attestation/result` handler from registration_handlers.go
func (s *server) handleAttestationResult(w http.ResponseWriter, r *http.Request) {
// Get saved creationOptions and user info from session.
// Parse and verify credential in request body.
credentialAttestation, _ := webauthn.ParseAttestation(r.Body)
expected := &webauthn.AttestationExpectedData{
Origin: s.rpOrigin,
RPID: savedCreationOptions.RP.ID,
CredentialAlgs: credentialAlgs,
Challenge: base64.RawURLEncoding.EncodeToString(savedCreationOptions.Challenge),
UserVerification: savedCreationOptions.AuthenticatorSelection.UserVerification,
}
_, _, err = webauthn.VerifyAttestation(credentialAttestation, expected)
// Save user credential in datastore.
c := &credential{
CredentialID: credentialAttestation.RawID,
UserID: uSession.User.UserID,
Counter: credentialAttestation.AuthnData.Counter,
CoseKey: credentialAttestation.AuthnData.Credential.Raw,
}
err = s.dataStore.addUserCredential(r.Context(), uSession.User, c)
// Write "ok" response.
}
تتطلب عملية المصادقة خطوتين: إنشاء خيارات طلب بيانات الاعتماد والتحقق من بيانات الاعتماد. انظر signin.html ، webauthn.authn.js ، و Authentication_handlers.go.
إنشاء خيارات طلب بيانات الاعتماد:
خادم مقابض /assertion/options عن طريق إرجاع خيارات طلب الاعتماد (publicKeyCredentialRequestOptions) إلى العميل. ثم يستخدم العميل هذه الخيارات مع navigator.credentials.get() للحصول على بيانات الاعتماد الموجودة.
// Simplified `/assertion/options` handler from authentication_handlers.go
func (s *server) handleAssertionOptions(w http.ResponseWriter, r *http.Request) {
// Get user from datastore by username.
u, _ := s.dataStore.getUser(r.Context(), optionsRequest.Username)
// Create PublicKeyCredentialRequestOptions using webauthn library.
requestOptions, _ := webauthn.NewAssertionOptions(s.webAuthnConfig, &webauthn.User{ID: u.UserID, Name: u.UserName, DisplayName: u.DisplayName, CredentialIDs: u.CredentialIDs})
// Save requestOptions and user info in session to verify credential later.
session.Values[WebAuthnRequestOptions] = requestOptions
session.Values[UserSession] = &userSession{User: u}
// Write requestOptions to response.
}
تحقق من بيانات الاعتماد:
يتحقق الخادم من بيانات الاعتماد المستلمة عبر /asssertion/result .
// Simplified `/assertion/result` handler from authentication_handlers.go
func (s *server) handleAssertionResult(w http.ResponseWriter, r *http.Request) {
// Get saved requestOptions and user info.
// Parse credential in request body.
credentialAssertion, _ := webauthn.ParseAssertion(r.Body)
// Get credential from datastore by received credential ID.
c, _ := s.dataStore.getCredential(r.Context(), uSession.User.UserID, credentialAssertion.RawID)
// Verify credential.
expected := &webauthn.AssertionExpectedData{
Origin: s.rpOrigin,
RPID: savedRequestOptions.RPID,
Challenge: base64.RawURLEncoding.EncodeToString(savedRequestOptions.Challenge),
UserVerification: savedRequestOptions.UserVerification,
UserID: uSession.User.UserID,
UserCredentialIDs: userCredentialIDs,
PrevCounter: c.Counter,
Credential: credKey,
}
err = webauthn.VerifyAssertion(credentialAssertion, expected)
// Update authenticator counter in datastore.
c.Counter = credentialAssertion.AuthnData.Counter
err = s.dataStore.updateCredential(r.Context(), c)
// Write "ok" response.
}
يتم توفير إصلاحات الأمان لأحدث إصدار تم إصداره.
للإبلاغ عن نقاط الضعف في الأمان ، يرجى إرسال بريد إلكتروني إلى [email protected] وإتاحة الوقت لحل المشكلة قبل الإبلاغ عن الجمهور.
حقوق الطبع والنشر (C) 2019-Faye Amacker الحاضر
Fxamacker/Webauthn-Demo مرخصة بموجب ترخيص Apache ، الإصدار 2.0. انظر ترخيص نص الترخيص الكامل.