buttonLogin.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <!-- 外层样式添加 position:relative 样式 -->
  3. <div class="btnLogin" @click="login"></div>
  4. </template>
  5. <script>
  6. import { getStorage, setStorage, removeStorage, storageKey, getOauthUrl, jumpUrl } from '../utils/help';
  7. import { postRequest } from '../http';
  8. export default {
  9. name: 'buttonLogin',
  10. computed: {
  11. userInfo() {
  12. return getStorage(storageKey.userInfo);
  13. }
  14. },
  15. data() {
  16. return {
  17. timer: null,
  18. }
  19. },
  20. unmounted() {
  21. clearInterval(this.timer);
  22. },
  23. methods: {
  24. login() {
  25. if (!!this.userInfo) {
  26. // 已登录
  27. this.$emit('success', this.userInfo)
  28. } else {
  29. // 未登录
  30. let isiOS = !!window.navigator.userAgent.match(/\(i\[^;]+;( U;)? CPU.+Mac OS X/)
  31. if (isiOS) {
  32. this.twitterIosAuth()
  33. } else {
  34. this.twitterAndroidAuth()
  35. }
  36. }
  37. },
  38. async twitterIosAuth() {
  39. let win = window.open();
  40. win.opener = null;
  41. postRequest(`/denet/user/twitterRequestToken`, {
  42. params: {
  43. oauthCallback: `${jumpUrl}authlogin`,
  44. },
  45. }).then(({ code, data }) => {
  46. if (code == 0) {
  47. win.location.href = getOauthUrl(data.authToken);
  48. // timer
  49. this.timer = setInterval(() => {
  50. if (win && win.closed) {
  51. clearInterval(this.timer);
  52. this.twitterLogin(data);
  53. }
  54. }, 500);
  55. } else {
  56. this.$emit('error')
  57. }
  58. })
  59. },
  60. async twitterAndroidAuth() {
  61. postRequest(`/denet/user/twitterRequestToken`, {
  62. params: {
  63. oauthCallback: `${jumpUrl}authlogin`,
  64. },
  65. }).then(({ code, data }) => {
  66. if (code == 0) {
  67. let win = window.open(getOauthUrl(data.authToken));
  68. // timer
  69. this.timer = setInterval(() => {
  70. if (win && win.closed) {
  71. clearInterval(this.timer);
  72. this.twitterLogin(data);
  73. }
  74. }, 500);
  75. } else {
  76. this.$emit('error')
  77. }
  78. })
  79. },
  80. twitterLogin(authData) {
  81. let verifier = getStorage(storageKey.verifier);
  82. if (verifier) {
  83. postRequest(`/denet/user/twitterLogin`, {
  84. params: {
  85. consumerKey: authData.consumerKey,
  86. oauthToken: authData.authToken,
  87. oauthVerifier: verifier,
  88. },
  89. }).then(({ code, data }) => {
  90. if (code == 0) {
  91. setStorage(storageKey.userInfo, data);
  92. removeStorage(storageKey.verifier);
  93. this.$emit('success', data)
  94. } else {
  95. this.$emit('error')
  96. }
  97. });
  98. } else {
  99. this.$emit('error')
  100. }
  101. }
  102. }
  103. }
  104. </script>
  105. <style lang="scss" scoped>
  106. .btnLogin {
  107. position: absolute;
  108. z-index: 10;
  109. top: 0;
  110. left: 0;
  111. width: 100%;
  112. height: 100%;
  113. }
  114. </style>