FormLoginOAuth.xaml.vb 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. Imports System.Windows.Navigation
  2. Public Class FormLoginOAuth
  3. Public Event OnLoginSuccess(code As String)
  4. Public Event OnLoginCanceled(IsSwitch As Boolean)
  5. '跳转事件
  6. Private IsLoginSuccessed As Boolean = False
  7. Private IsSwitch 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("PCL 不支持使用 GitHub 登录微软账号!", HintType.Critical)
  18. Close()
  19. End If
  20. End Sub
  21. '已导航事件
  22. Private IsFirstLoaded As Boolean = False
  23. Private IsFirstLoadedLock As New Object
  24. Private Sub Browser_Navigated(sender As WebBrowser, e As NavigationEventArgs) Handles Browser1.Navigated, Browser2.Navigated, Browser3.Navigated
  25. SyncLock IsFirstLoadedLock
  26. If IsFirstLoaded Then Exit Sub
  27. IsFirstLoaded = True
  28. End SyncLock
  29. RunInThread(Sub()
  30. Thread.Sleep(1000)
  31. RunInUi(Sub()
  32. sender.Visibility = Visibility.Visible
  33. PanLoading.Visibility = Visibility.Collapsed
  34. Log("[Login] 已将登录窗口切换至浏览器")
  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. RunInThread(Sub()
  63. Thread.Sleep(1000) '释放会卡一下,所以稍等一下……
  64. RunInUiWait(Sub()
  65. Try
  66. Browser1.Dispose()
  67. Catch ex As Exception
  68. Log(ex, "释放微软登录浏览器 1 失败")
  69. End Try
  70. End Sub)
  71. Thread.Sleep(200)
  72. RunInUiWait(Sub()
  73. Try
  74. Browser2.Dispose()
  75. Catch ex As Exception
  76. Log(ex, "释放微软登录浏览器 2 失败")
  77. End Try
  78. End Sub)
  79. Thread.Sleep(200)
  80. RunInUiWait(Sub()
  81. Try
  82. Browser3.Dispose()
  83. Catch ex As Exception
  84. Log(ex, "释放微软登录浏览器 3 失败")
  85. End Try
  86. End Sub)
  87. End Sub)
  88. If Not IsLoginSuccessed Then RaiseEvent OnLoginCanceled(IsSwitch)
  89. FrmMain.Focus()
  90. End Sub
  91. Private Sub HintSwitch_Click(sender As Object, e As EventArgs) Handles HintSwitch.Click
  92. IsSwitch = True
  93. Close()
  94. End Sub
  95. End Class