AI prompts
base on a2fa is a command line tool for generating and validating one-time password. Its purpose is to get rid of phones and be able to authenticate easily. # a2fa
a2fa *("annoying two-factor authentication")* is a command line tool for generating and validating one-time password.
<!-- TOC -->
* [Introduction](#introduction)
* [Installation](#installation)
+ [macOS](#macOS)
+ [Linux](#linux)
+ [Windows](#windows)
+ [Alternate ways](#Alternate-ways)
* [Usage](#usage)
* [Examples](#examples)
+ [Generate code](#generate-code)
+ [Add account](#add-account)
+ [List acccount](#list-acccount)
+ [Remove accounts](#remove-accounts)
+ [Update acccount](#update-acccount)
* [Reporting issues](#reporting-issues)
* [Contributing](#contributing)
* [License](#license)
<!-- /TOC -->
## Introduction
a2fa means annoying two-factor authentication. Its purpose is to get rid of phones and be able to authenticate easily. It keeps synced with Google Authenticator, Microsoft Authenticator.
**Description**:
* An easy-to-use substitute for 2FA apps like TOTP Google authenticator.
* Supports the OATH algorithms, such as TOTP and HOTP.
* No need for network connection.
* No need for phone.
## Installation
### macOS
```
brew install csyezheng/tap/a2fa
```
### Linux
**Archlinux**
```
paru -S a2fa
```
```
yay -S a2fa
```
**Debian-based Linux**
```
echo 'deb [trusted=yes] https://apt.fury.io/csyezheng/ /' | sudo tee /etc/apt/sources.list.d/fury.list
sudo apt update
sudo apt install a2fa
```
### Windows
```
winget install -e --id csyezheng.a2fa
```
### Alternate ways
Please see the [installation ](docs/installation.md)
## Usage
```
a2fa [command] [flags] [args]
```
```
Available Commands:
add Add account and its secret key
completion Generate the autocompletion script for the specified shell
generate Generate one-time password from secret key
help Help about any command
list List all added accounts and password code
remove Remove account and its secret key
update Add account and its secret key
version show version
```
```
a2fa generate [flags] <secret key>
a2fa add [flags] <account name> <secret key>
a2fa remove <account name> [user name]
a2fa update [flags] <account name> <secret key>
a2fa list [account name]
```
Commonly used flags
```
Flags:
-b, --base32 use base32 encoding of KEY instead of hex (default true)
-c, --counter int used for HOTP, A counter C, which counts the number of iterations
-e, --epoch int used for TOTP, epoch (T0) which is the Unix time from which to start counting time steps
-H, --hash string A cryptographic hash method H (SHA1, SHA256, SHA512) (default "SHA1")
-h, --help help for generate
-i, --interval int used for TOTP, an interval (Tx) which will be used to calculate the value of the counter CT (default 30)
-l, --length int A HOTP value length d (default 6)
-m, --mode string use use time-variant TOTP mode or use event-based HOTP mode (default "totp")
```
## Examples
### Generate code
Generate a **time-based** one-time password but do not save the secret key
```
a2fa generate ADOO3MCCCVO5AVD6
```
Generate a **counter-based** one-time password with counter 1
```
a2fa generate -m hotp -c 1 ADOO3MCCCVO5AVD6
```
### Add account
Add an account named GitHub
```
a2fa add GitHub ADOO3MCCCVO5AVD6
```
Add an account, the account name is GitHub, the user name is csyezheng
```
a2fa add GitHub:csyezheng ADOO3MCCCVO5AVD6
```
### List acccount
List all accounts
```shell
a2fa list
```
List all accounts named GitHub
```
a2fa list GitHub
```
List accounts whose account name is GitHub and whose username is csyezheng
```
a2fa list GitHub:csyezheng
```
List accounts whose account name is GitHub and whose username is csyezheng
```
a2fa list GitHub csyezheng
```
### Remove accounts
Remove all accounts named GitHub
```
a2fa remove GitHub
```
Delete accounts whose account name is GitHub and whose username is csyezheng
```
a2fa remove GitHub csyezheng
```
### Update acccount
Update the secret key of accounts which account name is GitHub
```
a2fa update GitHub 5BRSSSBJUWBQBOXE
```
Update the secret key of accounts which account name is GitHub and the username is csyezheng
```
a2fa update GitHub:csyezheng 5BRSSSBJUWBQBOXE
```
## Reporting issues
If you encounter any problems, you can open an issue in our bug tracker, please fill the issue template with *as much information as possible*.
## Contributing
Refer to [CONTRIBUTING.md](CONTRIBUTING.md)
## License
Apache License 2.0, see [LICENSE](LICENSE).
", Assign "at most 3 tags" to the expected json: {"id":"4694","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"