Golang client for the Smart-ID API (https://www.smart-id.com). It is a simple wrapper around the API, which helps easily integrate Smart-ID authentication into Golang applications.
- Flexible client configuration
- Concurrent processing
- Optional TLS configuration (certificate pinning)
Use go get to install the package
go get -u github.com/tab/smartidCreate a new client using NewClient() and customize its configuration using chainable methods.
package main
import (
"context""log""time""github.com/tab/smartid"
)
funcmain() {
client:=smartid.NewClient().
WithRelyingPartyName("DEMO").
WithRelyingPartyUUID("00000000-0000-0000-0000-000000000000").
WithCertificateLevel("QUALIFIED").
WithHashType("SHA512").
WithInteractionType("displayTextAndPIN").
WithDisplayText60("Enter PIN1").
WithDisplayText200("Confirm the authentication request and enter PIN1").
WithURL("https://sid.demo.sk.ee/smart-id-rp/v2").
WithTimeout(60*time.Second)
iferr:=client.Validate(); err!=nil {
log.Fatal("Invalid configuration:", err)
}
// Further processing...
}Initiate a new authentication session with the Smart-ID provider by calling CreateSession.
This function generates a random hash, constructs the session request, and returns a session that includes an identifier and a verification code.
funcmain() {
// Create a client...identity:=smartid.NewIdentity(smartid.TypePNO, "EE", "30303039914")
session, err:=client.CreateSession(context.Background(), identity)
iferr!=nil {
log.Fatal("Error creating session:", err)
}
fmt.Println("Session created:", session)
}funcmain() {
// Create a client...person, err:=client.FetchSession(context.Background(), sessionId)
iferr!=nil {
log.Fatal("Error fetching session:", err)
}
fmt.Println("Session status:", session.State)
}For applications requiring the processing of multiple authentication sessions simultaneously, Smart-ID provides a worker model.
Create a worker using NewWorker, configure its concurrency and queue size, and then start processing.
package main
import (
"context""fmt""log""sync""time""github.com/tab/smartid"
)
funcmain() {
client:=smartid.NewClient().
WithRelyingPartyName("DEMO").
WithRelyingPartyUUID("00000000-0000-0000-0000-000000000000").
WithCertificateLevel("QUALIFIED").
WithHashType("SHA512").
WithInteractionType("displayTextAndPIN").
WithDisplayText60("Enter PIN1").
WithDisplayText200("Confirm the authentication request and enter PIN1").
WithURL("https://sid.demo.sk.ee/smart-id-rp/v2").
WithTimeout(60*time.Second)
identities:= []string{
smartid.NewIdentity(smartid.TypePNO, "EE", "30303039914"),
smartid.NewIdentity(smartid.TypePNO, "EE", "30403039917"),
smartid.NewIdentity(smartid.TypePNO, "EE", "30403039928"),
// Add more identities as needed
}
worker:=smartid.NewWorker(client).
WithConcurrency(50).
WithQueueSize(100)
ctx:=context.Background()
worker.Start(ctx)
deferworker.Stop()
varwg sync.WaitGroupfor_, identity:=rangeidentities {
wg.Add(1)
session, err:=client.CreateSession(ctx, identity)
iferr!=nil {
log.Println("Error creating session:", err)
wg.Done()
continue
}
fmt.Println("Session created:", session)
resultCh:=worker.Process(ctx, session.Id)
gofunc() {
deferwg.Done()
result:=<-resultChifresult.Err!=nil {
log.Println("Error fetching session:", result.Err)
} else {
fmt.Println("Fetched person:", result.Person)
}
}()
}
wg.Wait()
}package main
import (
"context""fmt""sync""time""github.com/tab/smartid"
)
funcmain() {
manager, err:=smartid.NewCertificateManager("./certs")
iferr!=nil {
fmt.Println("Failed to create certificate manager:", err)
}
tlsConfig:=manager.TLSConfig()
client:=smartid.NewClient().
WithRelyingPartyName("DEMO").
WithRelyingPartyUUID("00000000-0000-0000-0000-000000000000").
WithCertificateLevel("QUALIFIED").
WithHashType("SHA512").
WithInteractionType("displayTextAndPIN").
WithDisplayText60("Enter PIN1").
WithDisplayText200("Confirm the authentication request and enter PIN1").
WithURL("https://sid.demo.sk.ee/smart-id-rp/v2").
WithTimeout(60*time.Second).
WithTLSConfig(tlsConfig)
// Further processing...Smart-ID requires a properly formatted identity string. Use the NewIdentity function to create this string.
It combines the identity type, country code, and the identifier value.
package main
import (
"fmt""github.com/tab/smartid"
)
funcmain() {
identity:=smartid.NewIdentity(smartid.TypePNO, "EE", "30303039914")
fmt.Println("Formatted identity:", identity)
}Distributed under the MIT License. See LICENSE for more information.