我在try 将Ffltter应用程序连接到SignalR时遇到身份验证问题.后端服务器正确地接收令牌,但是到集线器集的连接被验证为FALSE.我try 了各种方法,但都没有成功.任何帮助都将不胜感激.谢谢!
Package used个
- SignalR_Netcore: Git: 网址:https://github.com/geekz-reno/signalr_client.git 参考:大师级
flutter doctor -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!
Code connect to hub个
// 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');
}
}
Code backend server个
/* 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;
}```