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);
        }
Пример #3
0
        private async Task SignInAsync(JoinMisskeyInstanceViewModel vm)
        {
            if (!vm.Meta.Value.Features.miauth)
            {
                await Root.DisplayAlert("ログインできません", "Groundpolis Mobile は MiAuth 認証のみを現在サポートしていますが、このインスタンスは旧式の認証方式のみをサポートしているため、ご利用いただけません。他のインスタンスをご利用ください", "OK");

                return;
            }

            await MiAuthAsync(vm);
        }
Пример #4
0
        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");
            }
        }