Xamarin.android + ошибка аутентификации auth0: net: ERR_UNKNOWN_URL_SCHEME - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу войти в свое приложение xamarin.android через auth0. Я нашел этот урок, который описывает его так хорошо.

Я просто использую xamarin.android вместо "чистого" приложения для Android на c #.

Но у меня есть эта ошибка: enter image description here

Как видите, у меня есть действительный ответ от auth0 с callback?code={code} но, похоже, есть проблема с методом активации намерения. (он не может разобрать ответ в правильной схеме. Возможно, он предполагает, что это URL-адрес, и просто перенаправляет вызов через браузер).

Вот мой код MainActivity:

usings ***

namespace myApp.intake.Mobile.Droid
{
    [Activity(Label = "App", 
        Icon = "@drawable/icon", 
        Theme = "@style/MainTheme", 
        MainLauncher = true,
        LaunchMode = LaunchMode.SingleInstance,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    [IntentFilter(
        new[] { Intent.ActionView },
        DataScheme = "myApp.intake.mobile",
        DataHost = "myApp-dev.auth0.com",
        DataPathPrefix = "/android/myApp.intake.mobile/callback")]
    public class MainActivity : FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            client = new Auth0Client(new Auth0ClientOptions
            {
                Domain = "myApp-dev.auth0.com",
                ClientId = "************", //real clientId
                Activity = this
            });

            Forms.Init(this, bundle);
            LoadApplication(new App());

            this.PerformAuth0Login();
        }

        protected override async void OnNewIntent(Intent intent)
        {
            // I have to get redirected here but it just throw the mentioned error!!!!!!
            base.OnNewIntent(intent);

            var loginResult = await client.ProcessResponseAsync(intent.DataString, authorizeState);

            var sb = new StringBuilder();
            if (loginResult.IsError)
            {
                // logic to handle the error
            }
            // next business logic
        }

        #region Private Logic

        private async void PerformAuth0Login()
        {
            // Prepare for the login
            authorizeState = await client.PrepareLoginAsync();

            // Send the user off to the authorization endpoint
            var uri = Android.Net.Uri.Parse(authorizeState.StartUrl);
            var intent = new Intent(Intent.ActionView, uri);
            intent.AddFlags(ActivityFlags.NoHistory);
            StartActivity(intent); //I think problem here..
        }

        #endregion

        #region Private Fields

        private Auth0Client client;
        private AuthorizeState authorizeState;

        #endregion
    }
}

Спасибо за любую помощь заранее!

1 Ответ

0 голосов
/ 29 апреля 2018

Хорошо, я только что решил.

Я забыл указать, что Intent.CategoryDefault, Intent.CategoryBrowsable категории в IntentFilter:

[Activity(...)]
[IntentFilter(
        new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
        DataScheme = "myApp.intake.mobile",
        DataHost = "myApp-dev.auth0.com",
        DataPathPrefix = "/android/myApp.intake.mobile/callback")]
    public class MainActivity : FormsAppCompatActivity
{...}

Как я понял, этот атрибут должен быть скомпилирован в файл AndroidManifest.xml примерно так:

  <activity
    android:name="com.spotify.sdk.demo.DemoActivity"
    android:label="IntakeMobile"
    android:launchMode="singleInstance">
    <intent-filter>
      <action android:name="android.intent.action.VIEW"/>
      <category android:name="android.intent.category.DEFAULT"/>
      <category android:name="android.intent.category.BROWSABLE"/>
      <data
         android:host="callback"
         android:scheme="testschema"/>
    </intent-filter>
  </activity>

Надеюсь, это сэкономит кому-то время.

...