Session.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. Ext.define('saas.model.Session', {
  2. extend: 'Ext.data.Model',
  3. fields: [
  4. { name: 'token', type: 'string' },
  5. { name: 'expire', type: 'number' },
  6. { name: 'timestamp', type: 'number' },
  7. { name: 'span', type: 'number' },
  8. { name: 'account' }
  9. ],
  10. statics: {
  11. login: function(username, password, companyId) {
  12. let params = {
  13. username: username,
  14. password: password
  15. };
  16. if(companyId) {
  17. params.companyId = companyId;
  18. }
  19. return new Ext.Promise(function (resolve, reject) {
  20. Ext.Ajax.request({
  21. url: '/api/auth/authorize',
  22. params: params,
  23. method: 'POST',
  24. success: function (response) {
  25. var res = Ext.decode(response.responseText);
  26. if (res.success) {
  27. var session = saas.model.Session.loadData(res.data.token);
  28. session.set('account', res.data.account);
  29. // 服务端与本地存在时间差
  30. session.set('span', session.get('timestamp') - new Date().getTime());
  31. if (!session.isValid()) {
  32. reject({
  33. message: '登录失败,无效身份令牌'
  34. });
  35. } else {
  36. resolve(session);
  37. }
  38. } else {
  39. Ext.log.error('request failure with code: ', res.code, ', message: ', res.message);
  40. reject(res);
  41. }
  42. },
  43. failure: function (response) {
  44. Ext.log.error('server-side failure with status code: ', response.status);
  45. reject(response);
  46. }
  47. });
  48. });
  49. },
  50. switchCompany: function(oldSession, companyId) {
  51. return new Ext.Promise(function (resolve, reject) {
  52. Ext.Ajax.request({
  53. url: '/api/auth/switch/company',
  54. params: {
  55. companyId: companyId
  56. },
  57. method: 'GET',
  58. headers: {
  59. 'Authorization': oldSession.get('token')
  60. },
  61. success: function (response) {
  62. var res = Ext.decode(response.responseText);
  63. if (res.success) {
  64. var newSession = saas.model.Session.loadData(res.data);
  65. newSession.set('account', oldSession.get('account'));
  66. // 服务端与本地存在时间差
  67. newSession.set('span', newSession.get('timestamp') - new Date().getTime());
  68. if (!newSession.isValid()) {
  69. reject({
  70. message: '切换失败,无效身份令牌'
  71. });
  72. } else {
  73. resolve(newSession);
  74. }
  75. } else {
  76. Ext.log.error('request failure with code: ', res.code, ', message: ', res.message);
  77. reject(res);
  78. }
  79. },
  80. failure: function (response) {
  81. Ext.log.error('server-side failure with status code: ', response.status);
  82. reject(response);
  83. }
  84. });
  85. });
  86. }
  87. },
  88. isValid: function() {
  89. return !Ext.isEmpty(this.get('token')) && this.get('token').length > 128
  90. && this.get('timestamp') + this.get('expire') * 1000 > new Date().getTime() + this.get('span');
  91. },
  92. logout: function() {
  93. return new Ext.Promise(function (resolve, reject) {
  94. resolve({});
  95. });
  96. }
  97. });