1
0
mirror of https://github.com/XFox111/SimpleOTP.git synced 2026-04-22 08:00:45 +03:00

Updated Configuration (markdown)

2021-06-01 17:43:03 +03:00
parent 4ba6837a95
commit 699e03fa51
+100 -1
@@ -1,5 +1,104 @@
Since you probably have multiple users on your service or multiple services on your device, you need to handle configurations for all the cases you have
For list of configuration properties please refer to [OTPConfiguration - API reference](https://github.com/XFox111/SimpleOTP/wiki/OTPConfiguration)
## Generate configuration
To generate new configuration for user, simply call `OTPConfiguration.GenerateConfiguration`. It will generate new secret key for the instance and apply recommended settings (see below)
```csharp
OTPConfiguration config = OTPConfiguration.GenerateConfiguration("My service name", "target_username@or_an_email.com");
```
Default configuration
- OTP algorithm: Time-based OTP
- Key length: 160 bit (20 characters)
- Hashing algorithm: HMAC-SHA-1
- OTP length: 6 digits
- Period: 30 seconds
To override some of settings in generated configurations, you can set them manually:
```csharp
OTPConfiguration config = OTPConfiguration.GenerateConfiguration("My service name", "target_username@or_an_email.com");
config.Digits = 8;
config.Algorithm = Algorithm.SHA512;
config.Period = TimeSpan.FromSeconds(60);
// etc.
```
## Load configuration
To load existing configuration, you can call `GetConfiguration(string, string, string)` to load configuration with default settings. If you do so, you need to store only information about these three values.
```csharp
OTPConfiguration config = OTPConfiguration.GenerateConfiguration("MYSECRETKEY", "My service name", "target_username@or_an_email.com");
Console.WriteLine(config);
// OTPModel { Id = af2358b0-3f69-4dd7-9537-32c07d6663aa, Type = TOTP, IssuerLabel = My service name, AccountName = target_username@or_an_email.com, Secret = MYSECRETKEY, Issuer = My service name, Algorithm = SHA1, Digits = 6, Counter = 0, Period = 00:00:30 }
```
Alternatively, you can load configuration from [OTP AUTH URI](https://github.com/google/google-authenticator/wiki/Key-Uri-Format). In this way, you need to store only array of URIs:
```csharp
string sample_config_uri = "otpauth://totp/FoxDev%20Studio:eugene@xfox111.net?secret=ESQVTYRM2CWZC3NX24GRRWIAUUWVHWQH&issuer=FoxDev%20Studio";
OTPConfiguration config = OTPConfiguration.GetConfiguration(sample_config_uri);
// OTPConfiguration { Id = af2358b0-3f69-4dd7-9537-32c07d6663aa, Type = TOTP, IssuerLabel = FoxDev Studio, AccountName = eugene@xfox111.net, Secret = ESQVTYRM2CWZC3NX24GRRWIAUUWVHWQH, Issuer = FoxDev Studio, Algorithm = SHA1, Digits = 6, Counter = 0, Period = 00:00:30 }
```
Or just fill in properties manually. Then you need to serialize and deserialize the whole object:
```csharp
OTPConfiguration config = new ()
{
Type = OTPType.TOTP,
IssuerLabel = "My service name",
AccountName = "target_username@or_an_email.com",
Secret = "MYSECRETKEY", // To generate new secret you can use SimpleOTP.Helpers.SecretGenerator.GenerateSecret()
Issuer = "My service name",
Algorithm = Algorithm.SHA1,
Digits = 6,
Period = TimeSpan.FromSeconds(30)
}
```
## Store configuration
TODO
You can store data in three different ways:
### 1. Store whole object instance in database (suitable for server side):
```csharp
OTPConfiguration config = dbContenxt.Configs.Find("af2358b0-3f69-4dd7-9537-32c07d6663aa");
dbContext.Configs.Update(config);
dbContext.SaveChanges();
```
Data in database `Configs` table:
| Id (PRIMARY_KEY) | Type | IssuerLabel | AccountName | Secret | Issuer | Algorithm | Digits | Counter | Period |
| ---------------- | ---- | ----------- | ----------- | ------ | ------ | --------- | ------ | ------- | ------ |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| af2358b0-3f69-4dd7-9537-32c07d6663aa | 0 | FoxDev Studio | eugene@xfox111.net | ESQVTYRM2CWZC3NX24GRRWIAUUWVHWQH | FoxDev Studio | 0 | 6 | 0 | 00:30:00.000 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
### 2. Store serialized object as string in storage (e.g. `Xamarin.Essentials.Preferences`)
```csharp
List<OTPConfiguration> list = JsonConvert.DeserializeObject<List<OTPConfiguration>>(Preferences.Get("configs", "[]"); // [] - Empty JSON array for fallback value
list.Add(config);
Preferences.Set("configs", JsonConvert.SerializeObject(list));
```
Storage content:
```json
[
{
"Id": "af2358b0-3f69-4dd7-9537-32c07d6663aa",
"Type": 0,
"IssuerLabel": "FoxDev Studio",
"AccountName": "eugene@xfox111.net",
"Secret": "ESQVTYRM2CWZC3NX24GRRWIAUUWVHWQH",
"Issuer": "FoxDev Studio",
"Algorithm": 0,
"Digits": 6,
"Counter": 0,
"Period": "00:30:00"
}
]
```
### 3. Store OTP AUTH URIs:
```csharp
List<OTPConfiguration> list = JsonConvert.DeserializeObject<string[]>(Preferences.Get("configs", "[]").Select(i => OTPConfiguration.GetConfiguration(i)).ToList();
list.Add(config);
Preferences.Set("configs", JsonConvert.SerializeObject(list.Select(i => i.GetUri().AbsoluteUri).ToArray()));
```
Storage content:
```json
[
"otpauth://totp/FoxDev%20Studio:eugene@xfox111.net?secret=ESQVTYRM2CWZC3NX24GRRWIAUUWVHWQH&issuer=FoxDev%20Studio",
"otpauth://totp/Service1:eugene@xfox111.net?secret=ESQ4GRRWIAUUWVHWQHVTYRM2CWZC3NX2&issuer=Service1",
"otpauth://totp/Service2:eugene@xfox111.net?secret=NX24GRRWIAUESQVTYRM2CWZC3UWVHWQH&issuer=Service2",
"otpauth://totp/Service3:eugene@xfox111.net?secret=WZCESQVTYRM2C3NX24GRRWIAUUWVHWQH&issuer=Service3"
]
```