index.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const {
  2. UniCloudError
  3. } = require('../../../../common/error')
  4. const {
  5. resolveUrl
  6. } = require('../../../../common/utils')
  7. const {
  8. callQQOpenApi
  9. } = require('../normalize')
  10. module.exports = class Auth {
  11. constructor (options) {
  12. this.options = Object.assign({
  13. baseUrl: 'https://graph.qq.com',
  14. timeout: 5000
  15. }, options)
  16. }
  17. async _requestQQOpenapi ({ name, url, data, options }) {
  18. const defaultOptions = {
  19. method: 'GET',
  20. dataType: 'json',
  21. dataAsQueryString: true,
  22. timeout: this.options.timeout
  23. }
  24. const result = await callQQOpenApi({
  25. name: `auth.${name}`,
  26. url: resolveUrl(this.options.baseUrl, url),
  27. data,
  28. options,
  29. defaultOptions
  30. })
  31. return result
  32. }
  33. async getUserInfo ({
  34. accessToken,
  35. openid
  36. } = {}) {
  37. const url = '/user/get_user_info'
  38. const result = await this._requestQQOpenapi({
  39. name: 'getUserInfo',
  40. url,
  41. data: {
  42. oauthConsumerKey: this.options.appId,
  43. accessToken,
  44. openid
  45. }
  46. })
  47. return {
  48. nickname: result.nickname,
  49. avatar: result.figureurl_qq_1
  50. }
  51. }
  52. async getOpenidByToken ({
  53. accessToken
  54. } = {}) {
  55. const url = '/oauth2.0/me'
  56. const result = await this._requestQQOpenapi({
  57. name: 'getOpenidByToken',
  58. url,
  59. data: {
  60. accessToken,
  61. unionid: 1,
  62. fmt: 'json'
  63. }
  64. })
  65. if (result.clientId !== this.options.appId) {
  66. throw new UniCloudError({
  67. code: 'APPID_NOT_MATCH',
  68. message: 'appid not match'
  69. })
  70. }
  71. return {
  72. openid: result.openid,
  73. unionid: result.unionid
  74. }
  75. }
  76. async code2Session ({
  77. code
  78. } = {}) {
  79. const url = 'https://api.q.qq.com/sns/jscode2session'
  80. const result = await this._requestQQOpenapi({
  81. name: 'getOpenidByToken',
  82. url,
  83. data: {
  84. grant_type: 'authorization_code',
  85. appid: this.options.appId,
  86. secret: this.options.secret,
  87. js_code: code
  88. }
  89. })
  90. return result
  91. }
  92. }