{"id":37201126,"url":"https://github.com/zxdev/passkey","last_synced_at":"2026-01-14T23:11:20.911Z","repository":{"id":245706146,"uuid":"818866500","full_name":"zxdev/passkey","owner":"zxdev","description":"rolling interval tokens for machine-to-machine authentication","archived":false,"fork":false,"pushed_at":"2025-05-23T04:38:12.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-09T21:45:40.273Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zxdev.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-06-23T05:15:46.000Z","updated_at":"2025-05-23T04:38:16.000Z","dependencies_parsed_at":"2024-06-23T15:48:50.337Z","dependency_job_id":"1c81d89e-824f-4be1-9fc8-292b9ec8efed","html_url":"https://github.com/zxdev/passkey","commit_stats":null,"previous_names":["zxdev/passkey"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/zxdev/passkey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zxdev%2Fpasskey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zxdev%2Fpasskey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zxdev%2Fpasskey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zxdev%2Fpasskey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zxdev","download_url":"https://codeload.github.com/zxdev/passkey/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zxdev%2Fpasskey/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28437936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T22:37:52.437Z","status":"ssl_error","status_checked_at":"2026-01-14T22:37:31.496Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-14T23:11:20.351Z","updated_at":"2026-01-14T23:11:20.863Z","avatar_url":"https://github.com/zxdev.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# passkey authentication\n\nA simple authentication system for machine-to-machine communication utilizing a rolling interval based authentication code derived from a shared secret using the concept of RFC 4226 OTP standards.\n\n###  The ```passkey/cmd``` and ```passkey/example``` folders have working examples.\n\nFor a working client-server example ```go run example/server/main.go``` and then ```go run example/client/main.go``` in a different terminal.\n\n---\n\n* **CMD wrapper** provides:\n    * secret generation\n    * code generation passkey generator for manual testing\n        * ```go build cmd/pkgen.go``` is provided to obtain the current interval passkey \n        * token can be drived and utilized with curl from the shell via ```curl -H token:$(pkgen AW6TJVTYMAYJXLWFW2WWJ6D3Q5B2AY25) http://localhost:1455/demo```\n    * install pkgen command line utility with ```sudo go build cmd/main.go -o /usr/local/bin/pkgen```\n\n```golang\nfunc main() {\n\n\t// configure secret\n\tvar secret = os.Getenv(\"SECRET\")\n\tif len(secret) == 0 \u0026\u0026 len(os.Args) \u003e 1 {\n\t\tsecret = os.Args[1]\n\t}\n\n\t// configure interval\n\tvar interval time.Duration\n\tif n := os.Getenv(\"INTERVAL\"); len(n) \u003e 0 {\n\t\ti, _ := strconv.Atoi(n)\n\t\tinterval = time.Duration(i) * time.Second\n\t}\n\tif interval == 0 \u0026\u0026 len(os.Args) \u003e 2 {\n\t\ti, _ := strconv.Atoi(os.Args[2])\n\t\tinterval = time.Duration(i) * time.Second\n\t}\n\n\t// configure passkey.CMD using the secret and interval and when\n\t// none are supplied a random secret will be generated\n\tpk := new(passkey.CMD)\n\tpk.Interval(\u0026interval)\n\tcurrent := pk.Current(secret)\n\tif len(secret) == 0 {\n\t\tfmt.Fprintln(os.Stdout, pk.Show())\n\t\treturn\n\t}\n\n\tfmt.Fprintln(os.Stdout, current)\n}\n```\n---\n\n* **Server wrapper** provides:\n    * HKey setting\n    * IsValid middleware\n\n```golang\nfunc getRoot(w http.ResponseWriter, r *http.Request) {\n\tlog.Println(\"got / request\")\n\tw.Write([]byte(\"try /hello\"))\n}\n\nfunc getHello(w http.ResponseWriter, r *http.Request) {\n\tlog.Println(\"got /hello request\")\n\tw.Write([]byte(\"Hello!\"))\n}\n\nfunc main() {\n\n\tvar pk passkey.NewServer((context.Background(),\"PASSKEYXXBASE32XXSECRETXXEXAMPLE\")\n\n\trouter := http.NewServeMux()\n\trouter.Handle(\"/\", http.HandlerFunc(getRoot))\n\trouter.Handle(\"/hello\", pk.IsValid(http.HandlerFunc(getHello)))\n\n\thttp.ListenAndServe(\":8080\", router)\n\n}\n\n\n```\n---\n* **Client wrapper** provides:\n    * Token generation\n\n```golang\nfunc main() {\n\n\tvar timeout = time.Second * 15\n\tvar pk passkey.NewClient(context.Background(),\"PASSKEYXXBASE32XXSECRETXXEXAMPLE\")\n\n    client := \u0026http.Client{Timeout: timeout}\n    req, _ := http.NewRequest(\"GET\", \"http://localhost:8080/hello\", nil)\n    pk.SetHeader(req)\n    resp, err := client.Do(req)\n    if err != nil {\n        log.Println(err)\n        return\n    }\n    if resp.StatusCode != 200 {\n        log.Println(\"http:\", resp.StatusCode)\n        return\n    }\n\n    var buf bytes.Buffer\n    buf.ReadFrom(resp.Body)\n    log.Println(buf.String())\n\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzxdev%2Fpasskey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzxdev%2Fpasskey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzxdev%2Fpasskey/lists"}