FormLoginOAuth.xaml.vb 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. Imports System.Windows.Navigation
  2. Public Class FormLoginOAuth
  3. Public Event OnLoginSuccess(code As String)
  4. Public Event OnLoginCanceled(IsForceExit As Boolean)
  5. '跳转事件
  6. Private IsLoginSuccessed As Boolean = False
  7. Private IsForceExit As Boolean = False
  8. Private Sub Browser_Navigating(sender As WebBrowser, e As NavigatingCancelEventArgs) Handles Browser1.Navigating, Browser2.Navigating, Browser3.Navigating
  9. Dim Url As String = e.Uri.AbsoluteUri
  10. If ModeDebug Then Log("[Login] 登录浏览器 " & sender.Tag & " 导向:" & Url)
  11. If Url.Contains("code=") Then
  12. Dim Code As String = RegexSeek(Url, "(?<=code\=)[^&]+")
  13. Log("[Login] 抓取到 OAuth 返回码:" & Code)
  14. IsLoginSuccessed = True
  15. RaiseEvent OnLoginSuccess(Code)
  16. ElseIf Url.Contains("github.") Then
  17. Hint("PCL2 不支持使用 GitHub 登录微软账号!", HintType.Critical)
  18. IsForceExit = True
  19. Close()
  20. End If
  21. End Sub
  22. '已导航事件
  23. Private IsFirstLoaded As Boolean = False
  24. Private IsFirstLoadedLock As New Object
  25. Private Sub Browser_Navigated(sender As WebBrowser, e As NavigationEventArgs) Handles Browser1.Navigated, Browser2.Navigated, Browser3.Navigated
  26. SyncLock IsFirstLoadedLock
  27. If IsFirstLoaded Then Exit Sub
  28. IsFirstLoaded = True
  29. End SyncLock
  30. RunInThread(Sub()
  31. Thread.Sleep(1000)
  32. RunInUi(Sub()
  33. sender.Visibility = Visibility.Visible
  34. PanLoading.Visibility = Visibility.Collapsed
  35. End Sub)
  36. End Sub)
  37. End Sub
  38. '窗体的进出事件
  39. Public Shared LoginUrl1 As String = "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?prompt=login&client_id=00000000402b5328&response_type=code&scope=service%3A%3Auser.auth.xboxlive.com%3A%3AMBI_SSL&redirect_uri=https:%2F%2Flogin.live.com%2Foauth20_desktop.srf"
  40. Public Shared LoginUrl2 As String = "https://login.live.com/oauth20_authorize.srf?prompt=login&client_id=00000000402b5328&response_type=code&scope=service%3A%3Auser.auth.xboxlive.com%3A%3AMBI_SSL&redirect_uri=https:%2F%2Flogin.live.com%2Foauth20_desktop.srf"
  41. Private Sub FrmLoginOAuth_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
  42. Browser1.Navigate(LoginUrl1)
  43. RunInThread(Sub()
  44. '估计是由于时间戳原因,同时导航会导致误报密码失败
  45. Thread.Sleep(2500)
  46. RunInUi(Sub()
  47. Try '防止在 Dispose 之后调用
  48. If Not IsFirstLoaded Then Browser2.Navigate(LoginUrl1)
  49. Catch
  50. End Try
  51. End Sub)
  52. Thread.Sleep(2500)
  53. RunInUi(Sub()
  54. Try
  55. If Not IsFirstLoaded Then Browser3.Navigate(LoginUrl2)
  56. Catch
  57. End Try
  58. End Sub)
  59. End Sub)
  60. End Sub
  61. Private Sub FormLoginOAuth_Closed() Handles Me.Closed
  62. Try
  63. Browser1.Dispose()
  64. Browser2.Dispose()
  65. Browser3.Dispose()
  66. Catch ex As Exception
  67. Log(ex, "释放微软登录浏览器失败")
  68. End Try
  69. If Not IsLoginSuccessed Then RaiseEvent OnLoginCanceled(IsForceExit)
  70. FrmMain.Focus()
  71. End Sub
  72. End Class