Neste artigo irei demonstrar como você pode criar um gerador de Token em suas aplicações Xamarin.Forms.
ADICIONANDO O NUGET PACKAGE
Clique com o botão direito em cima de sua Solution e selecione “Manage NuGet Packages for Solution…”.
Digite “OtpSharp.Core” e selecione o plugin como demonstrado na imagem a seguir.
Selecione todos os projetos e clique no botão “Install”.
C#
Comece criando as propriedades como demonstrado a seguir.
using OtpSharp; | |
using System.Threading; | |
using Xamarin.Forms; | |
namespace DemoToken | |
{ | |
public partial class MainPage : ContentPage | |
{ | |
public string Codigo | |
{ | |
get => _codigo; | |
set | |
{ | |
_codigo = value; | |
OnPropertyChanged(); | |
} | |
} | |
private string _codigo; | |
public string Segundos | |
{ | |
get => _segundos; | |
set | |
{ | |
_segundos = value; | |
OnPropertyChanged(); | |
} | |
} | |
private string _segundos; | |
private readonly byte[] secretKey; | |
private Totp totp; | |
private Timer timer; | |
public MainPage() | |
{ | |
InitializeComponent(); | |
} | |
} | |
} |
No construtor, atribua a variável “secretKey” um identificador como demonstrado a seguir, para este exemplo chamei de “Id” mas pode ser o identificador de sua preferência. Recomendo que seja algo único para cada usuário, será utilizado para validação do Token.
public MainPage() | |
{ | |
//Identificador | |
string Id = "100"; | |
InitializeComponent(); | |
BindingContext = this; | |
secretKey = Encoding.UTF8.GetBytes(Id); | |
} |
Em seguida crie o método Callback que será responsável na geração do Token e no controle do tempo de validade. Também sobrescreva os seguintes métodos:
- OnAppearing – Instancie um timer para realizar chamadas ao método Callback.
- OnDisappearing – Descarte o timer.
public void Callback(object state) | |
{ | |
totp = new Totp(secretKey); | |
Codigo = totp.ComputeTotp(); | |
var remainingTime = totp.RemainingSeconds(); | |
Segundos = $"00:{remainingTime:00}"; | |
} | |
protected override void OnAppearing() | |
{ | |
base.OnAppearing(); | |
timer = new Timer(Callback, null, 0, 1000); | |
} | |
protected override void OnDisappearing() | |
{ | |
timer.Dispose(); | |
base.OnDisappearing(); | |
} |
Xaml
Para visualização crie duas Labels para demonstrar os valores das variáveis Codigo e Segundos.
<?xml version="1.0" encoding="utf-8" ?> | |
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | |
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | |
xmlns:local="clr-namespace:DemoToken" | |
x:Class="DemoToken.MainPage"> | |
<StackLayout Padding="10"> | |
<Label Text="{Binding Codigo}" | |
FontSize="64" TextColor="Blue" | |
HorizontalTextAlignment="Center" | |
HorizontalOptions="CenterAndExpand"/> | |
<Label Text="{Binding Segundos}" | |
FontSize="11" TextColor="Black" | |
HorizontalTextAlignment="Center" | |
HorizontalOptions="CenterAndExpand"/> | |
</StackLayout> | |
</ContentPage> |
Resultado
Validando o Token
Para realizar a validação do Token, utilize o método VerifyTotp como demonstrado a seguir. Ele irá retornar um boolean, sendo True para válido e False para inválido.
long ResultOut = 0; | |
var otp = new Totp(Encoding.UTF8.GetBytes(Id)); | |
bool valid = otp.VerifyTotp(Codigo, out ResultOut, null); |
Esse e todos os exemplos deste blog encontram-se disponíveis no GitHub.