buttonLogin.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. this.twitterAuth()
  31. }
  32. },
  33. async twitterAuth() {
  34. let win;
  35. let isiOS = !!window.navigator.userAgent.match(/\(i\[^;]+;( U;)? CPU.+Mac OS X/);
  36. if (isiOS) {
  37. win = window.open();
  38. win.opener = null;
  39. }
  40. // post
  41. postRequest(`/denet/user/twitterRequestToken`, {
  42. params: {
  43. oauthCallback: `${jumpUrl}authlogin`,
  44. },
  45. }).then(({ code, data }) => {
  46. if (code == 0) {
  47. if (isiOS) {
  48. win.location.href = getOauthUrl(data.authToken);
  49. } else {
  50. win = window.open(getOauthUrl(data.authToken));
  51. }
  52. // timer
  53. this.timer = setInterval(() => {
  54. if (win && win.closed) {
  55. clearInterval(this.timer);
  56. this.twitterLogin(data);
  57. }
  58. }, 500);
  59. } else {
  60. this.$emit('error')
  61. }
  62. })
  63. },
  64. twitterLogin(authData) {
  65. let verifier = getStorage(storageKey.verifier);
  66. if (verifier) {
  67. postRequest(`/denet/user/twitterLogin`, {
  68. params: {
  69. consumerKey: authData.consumerKey,
  70. oauthToken: authData.authToken,
  71. oauthVerifier: verifier,
  72. },
  73. }).then(({ code, data }) => {
  74. if (code == 0) {
  75. setStorage(storageKey.userInfo, data);
  76. removeStorage(storageKey.verifier);
  77. this.$emit('success', data)
  78. } else {
  79. this.$emit('error')
  80. }
  81. });
  82. } else {
  83. this.$emit('error')
  84. }
  85. }
  86. }
  87. }
  88. </script>
  89. <style lang="scss" scoped>
  90. .btnLogin {
  91. position: absolute;
  92. z-index: 10;
  93. top: 0;
  94. left: 0;
  95. width: 100%;
  96. height: 100%;
  97. }
  98. </style>