Added client.py for cli usage.
README.md updated to show cli usage. Account Creation message made more appropriate for consumption. Bug Fixed in scripts/get-admin.py
This commit is contained in:
parent
ce3f128745
commit
e4034813a2
5 changed files with 128 additions and 7 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,5 +1,4 @@
|
||||||
.vscode
|
.vscode
|
||||||
__pycache__
|
__pycache__
|
||||||
.env
|
.env
|
||||||
client.py
|
|
||||||
.idea/
|
.idea/
|
||||||
|
|
39
README.md
39
README.md
|
@ -66,3 +66,42 @@ pipenv run python app.py
|
||||||
```
|
```
|
||||||
|
|
||||||
By default, it would run at port `8000`.
|
By default, it would run at port `8000`.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
#### Get Admin Credentials
|
||||||
|
|
||||||
|
Run the following commands in your uotp directory
|
||||||
|
```shell
|
||||||
|
pipenv run python scripts/get-admin.py
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Create Auth Account (or any account)
|
||||||
|
|
||||||
|
Run the following command in your uotp directory:
|
||||||
|
```shell
|
||||||
|
pipenv run python client create \
|
||||||
|
--name auth --realm ungleich-auth \
|
||||||
|
--admin-name admin --admin-realm ungleich-admin \
|
||||||
|
--admin-seed admin_seed_here
|
||||||
|
```
|
||||||
|
|
||||||
|
In response, you would get a JSON object containing Message and
|
||||||
|
Credentials of newly created account.
|
||||||
|
|
||||||
|
#### List All Accounts with credentials
|
||||||
|
```shell
|
||||||
|
pipenv run python client.py list \
|
||||||
|
--admin-name admin_name_jere --admin-realm admin_realm_here \
|
||||||
|
--admin-seed admin_seed_here
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Verify OTP Credentials
|
||||||
|
```shell
|
||||||
|
pipenv run python client.py verify \
|
||||||
|
--name user_name_here --realm user_realm_here \
|
||||||
|
--seed user_seed_here --auth-name auth_name_here \
|
||||||
|
--auth-realm auth_realm_here --auth-seed auth_seed_here
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Delete OTP Account
|
||||||
|
|
12
app.py
12
app.py
|
@ -46,11 +46,13 @@ class Create(Resource):
|
||||||
_value = {"seed": pyotp.random_base32(), "realm": realms}
|
_value = {"seed": pyotp.random_base32(), "realm": realms}
|
||||||
etcd_client.put(_key, _value, value_in_json=True)
|
etcd_client.put(_key, _value, value_in_json=True)
|
||||||
return {
|
return {
|
||||||
"message": "Account Created\n"
|
"message": "Account Created",
|
||||||
"name: {}, realm: {}, seed: {}".format(
|
"credentials": {
|
||||||
data["name"], data["realm"], _value["seed"]
|
"name": data["name"],
|
||||||
)
|
"realm": _value["realm"],
|
||||||
}
|
"seed": _value["seed"]
|
||||||
|
}
|
||||||
|
}, 200
|
||||||
else:
|
else:
|
||||||
return schema.get_errors(), 400
|
return schema.get_errors(), 400
|
||||||
|
|
||||||
|
|
81
client.py
Normal file
81
client.py
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
import requests
|
||||||
|
import decouple
|
||||||
|
import pyotp
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
arg_parser = argparse.ArgumentParser()
|
||||||
|
arg_parser.add_argument("action", choices=["list", "create", "verify", "delete"])
|
||||||
|
arg_parser.add_argument("--name")
|
||||||
|
arg_parser.add_argument("--realm")
|
||||||
|
arg_parser.add_argument("--seed")
|
||||||
|
arg_parser.add_argument("--admin-name")
|
||||||
|
arg_parser.add_argument("--admin-realm")
|
||||||
|
arg_parser.add_argument("--admin-seed")
|
||||||
|
arg_parser.add_argument("--auth-name")
|
||||||
|
arg_parser.add_argument("--auth-realm")
|
||||||
|
arg_parser.add_argument("--auth-seed")
|
||||||
|
|
||||||
|
args = arg_parser.parse_args()
|
||||||
|
|
||||||
|
action = args.action
|
||||||
|
|
||||||
|
if action == "list":
|
||||||
|
assert args.admin_name and args.admin_realm and args.admin_seed, \
|
||||||
|
"You must pass --admin-name, --admin-realm and --admin-seed"
|
||||||
|
|
||||||
|
data = \
|
||||||
|
{
|
||||||
|
"admin_name": args.admin_name,
|
||||||
|
"admin_realm": args.admin_realm,
|
||||||
|
"admin_token": pyotp.TOTP(args.admin_seed).now()
|
||||||
|
}
|
||||||
|
r = requests.get("http://localhost:{}/list".format(decouple.config('PORT')),
|
||||||
|
json=data)
|
||||||
|
print(r.content.decode("utf-8"))
|
||||||
|
|
||||||
|
elif action == "create":
|
||||||
|
assert args.name and args.realm and args.admin_name and args.admin_realm and args.admin_seed, \
|
||||||
|
"You must pass --name, --realm, --admin-name, --admin-realm and --admin-seed"
|
||||||
|
|
||||||
|
data = \
|
||||||
|
{
|
||||||
|
"name": args.name,
|
||||||
|
"realm": args.realm,
|
||||||
|
"admin_name": args.admin_name,
|
||||||
|
"admin_realm": args.admin_realm,
|
||||||
|
"admin_token": pyotp.TOTP(args.admin_seed).now()
|
||||||
|
}
|
||||||
|
r = requests.post("http://localhost:{}/create".format(decouple.config('PORT')),
|
||||||
|
json=data)
|
||||||
|
print(r.content.decode("utf-8"))
|
||||||
|
|
||||||
|
elif action == "verify":
|
||||||
|
assert args.name and args.realm and args.seed and args.auth_name and args.auth_realm and args.auth_seed, \
|
||||||
|
"You must pass --name, --realm, --seed, --auth-name, --auth-realm and --auth-seed"
|
||||||
|
data = \
|
||||||
|
{
|
||||||
|
"name": args.name,
|
||||||
|
"realm": args.realm,
|
||||||
|
"token": pyotp.TOTP(args.seed).now(),
|
||||||
|
"auth_name": args.auth_name,
|
||||||
|
"auth_realm": args.auth_realm,
|
||||||
|
"auth_token": pyotp.TOTP(args.auth_seed).now()
|
||||||
|
}
|
||||||
|
r = requests.get("http://localhost:{}/verify".format(decouple.config('PORT')),
|
||||||
|
json=data)
|
||||||
|
print(r.content.decode("utf-8"))
|
||||||
|
|
||||||
|
elif action == "delete":
|
||||||
|
assert args.name and args.admin_name and args.admin_realm and args.admin_seed, \
|
||||||
|
"You must pass --name, --admin-name, --admin-realm and --admin-seed"
|
||||||
|
|
||||||
|
data = \
|
||||||
|
{
|
||||||
|
"name": args.name,
|
||||||
|
"admin_name": args.admin_name,
|
||||||
|
"admin_realm": args.admin_realm,
|
||||||
|
"admin_token": pyotp.TOTP(args.admin_seed).now()
|
||||||
|
}
|
||||||
|
r = requests.post("http://localhost:{}/delete".format(decouple.config('PORT')),
|
||||||
|
json=data)
|
||||||
|
print(r.content.decode("utf-8"))
|
|
@ -3,6 +3,6 @@ import decouple
|
||||||
from os.path import join as join_path
|
from os.path import join as join_path
|
||||||
from etcd3_wrapper import Etcd3Wrapper
|
from etcd3_wrapper import Etcd3Wrapper
|
||||||
|
|
||||||
client = Etcd3Wrapper(port=decouple.config('PORT'))
|
client = Etcd3Wrapper()
|
||||||
admin_uotp = client.get(join_path(decouple.config('BASE_PREFIX'), 'admin'))
|
admin_uotp = client.get(join_path(decouple.config('BASE_PREFIX'), 'admin'))
|
||||||
print(admin_uotp.value)
|
print(admin_uotp.value)
|
Loading…
Reference in a new issue