无法使用 SignalR [ABP] 验证 Flutter 应用程序

问题描述 投票:0回答:1

我在尝试将 Flutter 应用连接到 SignalR 时遇到身份验证问题。后端服务器正确接收令牌,但与集线器的连接将 isAuthenticated 设置为 false。我尝试了各种方法但没有成功。任何帮助将不胜感激。谢谢!

使用的包装

扑医生-v:

[√] Flutter (Channel master, 3.16.0-5.0.pre.15, on Microsoft Windows [Version 10.0.22621.2283], locale en-US)
    • Flutter version 3.16.0-5.0.pre.15 on channel master at C:\src\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision fe0275f9d5 (22 hours ago), 2023-10-05 05:57:26 -0400
    • Engine revision f8d53c5fe9
    • Dart version 3.2.0 (build 3.2.0-231.0.dev)
    • DevTools version 2.28.1

[√] Windows Version (Installed version of Windows is version 10 or higher)

[√] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
    • Android SDK at C:\Users\muonroi\AppData\Local\Android\Sdk
    • Platform android-33-ext5, build-tools 33.0.2
    • Java binary at: C:\Program Files\Android\Android Studio\jbr\bin\java
    • Java version OpenJDK Runtime Environment (build 11.0.15+0-b2043.56-9505619)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop Windows apps (Visual Studio Enterprise 2022 17.6.5)
    • Visual Studio at C:\Program Files\Microsoft Visual Studio\2022\Enterprise
    • Visual Studio Enterprise 2022 version 17.6.33829.357
    • Windows 10 SDK version 10.0.22000.0

[√] Android Studio (version 2022.1)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.15+0-b2043.56-9505619)

[√] VS Code (version 1.83.0)
    • VS Code at C:\Users\muonroi\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.74.0

[√] Connected device (4 available)
    • Android SDK built for x86 (mobile) • emulator-5554 • android-x86    • Android 10 (API 29) (emulator)
    • Windows (desktop)                  • windows       • windows-x64    • Microsoft Windows [Version 10.0.22621.2283]
    • Chrome (web)                       • chrome        • web-javascript • Google Chrome 117.0.5938.134
    • Edge (web)                         • edge          • web-javascript • Microsoft Edge 117.0.2045.47

[√] Network resources
    • All expected network resources are available.

• No issues found!

代码连接至集线器

// Flutter code to connect to the hub
await _initSharedPreferences();
_hubConnection = HubConnectionBuilder()
    .withUrl(
        SignalrCentral.chatStatus,
        options: HttpConnectionOptions(
            accessTokenFactory: () async {
                return _sharedPreferences
                    .getString(KeyToken.accessToken.name)!;
            },
            headers: SignalrCentral.getHeader(
                _sharedPreferences.getString(KeyToken.encToken.name)!)))
    .withAutomaticReconnect(retryDelays: [30000])
    .build();
await initHubAndListenStatus();

Future<void> initHubAndListenStatus() async {
    try {
        await _hubConnection.start();
        debugPrint('Connection established successfully');
    } catch (e) {
        print('Error starting hub connection: $e');
    }
}

代码后端服务器

/* This method is needed to authorize SignalR javascript client.
         * SignalR can not send authorization header. So, we are getting it from query string as an encrypted text. */
        private static Task QueryStringTokenResolver(MessageReceivedContext context)
        {
            if (context.HttpContext.Request.Path.Value.StartsWith("/signalr"))
            {
                var env = context.HttpContext.RequestServices.GetService<IWebHostEnvironment>();
                var config = env.GetAppConfiguration();
                var allowAnonymousSignalRConnection = bool.Parse(config["App:AllowAnonymousSignalRConnection"]);

                return SetToken(context, allowAnonymousSignalRConnection);
            }

            List<string> urlsUsingEnchAuthToken = new List<string>()
            {
                "/Chat/GetUploadedObject?",
                "/Profile/GetProfilePictureByUser?"
            };

            if (urlsUsingEnchAuthToken.Any(url => context.HttpContext.Request.GetDisplayUrl().Contains(url)))
            {
                if (context.HttpContext.Request.Headers.ContainsKey("authorization"))
                {
                    return Task.CompletedTask;
                }

                return SetToken(context, false);
            }

            return Task.CompletedTask;
        }


        private static Task SetToken(MessageReceivedContext context, bool allowAnonymous)
        {
            var qsAuthToken = context.HttpContext.Request.Query["enc_auth_token"].FirstOrDefault() ?? context.HttpContext.Request.Headers["enc_auth_token"].FirstOrDefault();
            if (qsAuthToken == null)
            {
                if (!allowAnonymous)
                {
                    throw new AbpAuthorizationException("SignalR auth token is missing.");
                }

                return Task.CompletedTask;
            }
            //Set auth token from cookie
            context.Token = SimpleStringCipher.Instance.Decrypt(qsAuthToken, AppConsts.DefaultPassPhrase);
            return Task.CompletedTask;
        }```
c# flutter signalr abp
1个回答
0
投票

我解决了身份验证时发送附加参数“enc_auth_token”(加密的AccessToken)时的问题

© www.soinside.com 2019 - 2024. All rights reserved.