private async void PerformSignIn(JoinMisskeyInstanceViewModel vm) { IsBusy.Value = true; Url.Value = vm.Url.Value; Name.Value = vm.Name.Value; IsBusy.Value = false; }
public SignInPageViewModel(JoinMisskeyInstanceViewModel vm) { SignInVisible = User.CombineLatest(Error, (v, e) => v == null && e == null).ToReadOnlyReactiveProperty(); UserVisible = User.Select(v => v != null).ToReadOnlyReactiveProperty(); ErrorVisible = Error.Select(v => v != null).ToReadOnlyReactiveProperty(); PerformSignIn(vm); }
private async Task SignInAsync(JoinMisskeyInstanceViewModel vm) { if (!vm.Meta.Value.Features.miauth) { await Root.DisplayAlert("ログインできません", "Groundpolis Mobile は MiAuth 認証のみを現在サポートしていますが、このインスタンスは旧式の認証方式のみをサポートしているため、ご利用いただけません。他のインスタンスをご利用ください", "OK"); return; } await MiAuthAsync(vm); }
private async Task MiAuthAsync(JoinMisskeyInstanceViewModel vm) { var uuid = Guid.NewGuid().ToString(); var url = $"https://{vm.Url.Value}/miauth/{uuid}?" + "name=Groundpolis+Mobile" + $"&callback={HttpUtility.UrlEncode(Const.MIAUTH_CALLBACK)}" + $"&permission={string.Join(",", Groundpolis.Permission)}"; // MVVM の流儀に反するけど、しらねー try { await WebAuthenticator.AuthenticateAsync(new Uri(url), new Uri(Const.MIAUTH_CALLBACK)); } catch (Exception) { return; } var miauthUrl = $"https://{vm.Url.Value}/api/miauth/{uuid}/check"; var res = await Http.PostAsync(miauthUrl, new StringContent("")); var json = await res.Content.ReadAsStringAsync(); var status = JsonConvert.DeserializeObject <MiAuthStatus>(json); if (status.Ok) { await Groundpolis.SignInAsync(status.Token, vm.Url.Value); while (Root.Navigation.ModalStack.Count > 0) { await Root.Navigation.PopModalAsync(); } } else { await Root.DisplayAlert("認証に失敗しました", "もう一度やり直してください。", "OK"); } }