Login.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <template>
  2. <div style="height: 100vh" class="div justify-center items-center">
  3. <q-card style="max-width: 300px" class="div">
  4. <q-card-title>
  5. {{texts.login_login}}
  6. </q-card-title>
  7. <q-card-main>
  8. <div>
  9. <q-field :label="texts.login_username">
  10. <q-input v-model="username" style="max-width: 300px"/>
  11. </q-field>
  12. <q-field :label="texts.login_password">
  13. <q-input type="password" v-model="password" style="max-width: 500px"/>
  14. </q-field>
  15. <div class="div">
  16. <q-btn style="max-width: 300px" @click="loginWithPassword">
  17. {{ texts.login_submit }}
  18. </q-btn>
  19. <q-btn style="max-width: 300px" @click="$router.push('/register')">
  20. {{ texts.login_register }}
  21. </q-btn>
  22. </div>
  23. </div>
  24. <br/>
  25. <div class="div">
  26. <q-btn v-for="(oauth, index) in oauth_clients" @click="login(index)"
  27. color='blue' style="max-width: 300px">
  28. {{ texts.login_login_with }} {{ oauth.name }}
  29. </q-btn>
  30. </div>
  31. </q-card-main>
  32. </q-card>
  33. </div>
  34. </template>
  35. <script>
  36. var ClientOAuth2 = require('client-oauth2')
  37. var api = require('../api.js')
  38. var db = require('../db.js')
  39. var utils = require('../utils.js')
  40. import {
  41. QCard,
  42. QLayout,
  43. QToolbar,
  44. QToolbarTitle,
  45. QBtn,
  46. QIcon,
  47. QList,
  48. QListHeader,
  49. QItem,
  50. QItemSide,
  51. QItemMain,
  52. QSelect,
  53. QInput,
  54. QField,
  55. QCardMain,
  56. QCardTitle
  57. } from 'quasar'
  58. export default {
  59. name: 'index',
  60. components: {
  61. QCard,
  62. QLayout,
  63. QToolbar,
  64. QToolbarTitle,
  65. QBtn,
  66. QIcon,
  67. QList,
  68. QListHeader,
  69. QItem,
  70. QItemSide,
  71. QItemMain,
  72. QSelect,
  73. QInput,
  74. QField,
  75. QCardMain,
  76. QCard,
  77. QCardTitle
  78. },
  79. data () {
  80. return {
  81. selected_language: '',
  82. languages: [],
  83. texts: {},
  84. username: '',
  85. password: '',
  86. selected_provider: 1000,
  87. oauth_clients: [
  88. ]
  89. }
  90. },
  91. methods: {
  92. open_popup: function (url, windowName) {
  93. var mwindow = window
  94. var myWindow = window.open(url, windowName, 'height=1000,width=750')
  95. if (window.focus) { myWindow.focus() }
  96. window.my = myWindow
  97. myWindow.onclose = () => { }
  98. return false
  99. },
  100. loginWithPassword: function () {
  101. var data = {
  102. username: this.username,
  103. password: this.password
  104. }
  105. var self = this
  106. api.login('rest-auth/login/', data)
  107. .then(data => {
  108. db.saveToken('Token ' + data.data.key)
  109. .then(data => { self.$router.push('/blank') })
  110. })
  111. .catch(err => {
  112. self.$q.notify('Authentication Error')
  113. })
  114. },
  115. login: function (clientId) {
  116. this.selected_provider = clientId
  117. var oauthData = this.oauth_clients[clientId].auth_data
  118. var auth = new ClientOAuth2(oauthData)
  119. this.open_popup(auth.token.getUri(), 'name')
  120. }
  121. },
  122. mounted () {
  123. var self = this
  124. utils.getTexts()
  125. .then(data => { self.texts = data })
  126. api.getAndSaveList('myauth/providers/').then((data) => { self.oauth_clients = data })
  127. window.addEventListener('message', function (event) {
  128. if (event.origin !== 'http://localhost:8080') { return false }
  129. api.login(self.oauth_clients[self.selected_provider].loginPath.slice(1), event.data.data)
  130. .then(data => {
  131. db.saveToken('Token ' + data.data.key)
  132. .then(data => self.$router.push('/blank'))
  133. })
  134. })
  135. }
  136. }
  137. </script>
  138. <style lang="stylus" scoped>
  139. .div
  140. display: flex
  141. flex-direction: column
  142. align-items: center
  143. </style>