login_oauth.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. from .tool.func import *
  2. def login_oauth_2(conn, platform, func):
  3. curs = conn.cursor()
  4. publish_url = load_oauth('publish_url')
  5. oauth_data = load_oauth(platform)
  6. api_url = {}
  7. data = {
  8. 'client_id' : oauth_data['client_id'],
  9. 'client_secret' : oauth_data['client_secret'],
  10. 'redirect_uri' : publish_url + '/oauth/' + platform + '/callback',
  11. 'state' : 'RAMDOMVALUE'
  12. }
  13. if platform == 'discord':
  14. api_url['redirect'] = 'https://discordapp.com/api/oauth2/authorize'
  15. api_url['token'] = 'https://discordapp.com/api/oauth2/token'
  16. api_url['profile'] = 'https://discordapp.com/api/users/@me'
  17. elif platform == 'naver':
  18. api_url['redirect'] = 'https://nid.naver.com/oauth2.0/authorize'
  19. api_url['token'] = 'https://nid.naver.com/oauth2.0/token'
  20. api_url['profile'] = 'https://openapi.naver.com/v1/nid/me'
  21. elif platform == 'facebook':
  22. api_url['redirect'] = 'https://www.facebook.com/v3.1/dialog/oauth'
  23. api_url['token'] = 'https://graph.facebook.com/v3.1/oauth/access_token'
  24. api_url['profile'] = 'https://graph.facebook.com/me'
  25. if func == 'init':
  26. if oauth_data['client_id'] == '' or oauth_data['client_secret'] == '':
  27. return easy_minify(flask.render_template(skin_check(),
  28. imp = [load_lang('error'), wiki_set(), custom(), other2([0, 0])],
  29. data = load_lang('oauth_disabled'),
  30. menu = [['user', load_lang('return')]]
  31. ))
  32. elif publish_url == 'https://':
  33. return easy_minify(flask.render_template(skin_check(),
  34. imp = [load_lang('error'), wiki_set(), custom(), other2([0, 0])],
  35. data = load_lang('oauth_setting_not_found'),
  36. menu = [['user', load_lang('return')]]
  37. ))
  38. referrer_re = re.compile(r'(?P<host>^(https?):\/\/([^\/]+))\/(?P<refer>[^\/?]+)')
  39. if flask.request.referrer != None:
  40. referrer = referrer_re.search(flask.request.referrer)
  41. if referrer.group('host') != load_oauth('publish_url'):
  42. return redirect()
  43. else:
  44. flask.session['referrer'] = referrer.group('refer')
  45. else:
  46. return redirect()
  47. flask.session['refer'] = flask.request.referrer
  48. if platform == 'discord':
  49. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&response_type=code&scope=identify'.format(
  50. data['client_id'],
  51. data['redirect_uri']
  52. ))
  53. elif platform == 'naver':
  54. return redirect(api_url['redirect'] + '?response_type=code&client_id={}&redirect_uri={}&state={}'.format(
  55. data['client_id'],
  56. data['redirect_uri'],
  57. data['state']
  58. ))
  59. elif platform == 'facebook':
  60. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&state={}'.format(
  61. data['client_id'],
  62. data['redirect_uri'],
  63. data['state']
  64. ))
  65. elif func == 'callback':
  66. code = flask.request.args.get('code')
  67. state = flask.request.args.get('state')
  68. if code == None:
  69. return easy_minify(flask.render_template(skin_check(),
  70. imp = [load_lang('inter_error'), wiki_set(), custom(), other2([0, 0])],
  71. data = '<h2>ie_wrong_callback</h2>' + load_lang('ie_wrong_callback'),
  72. menu = [['user', load_lang('return')]]
  73. ))
  74. if platform == 'discord':
  75. data = {
  76. 'client_id' : data['client_id'],
  77. 'client_secret' : data['client_secret'],
  78. 'grant_type' : 'authorization_code',
  79. 'redirect_uri' : data['redirect_uri'],
  80. 'scope' : 'identify',
  81. 'code' : code
  82. }
  83. headers = {
  84. 'Content-Type': 'application/x-www-form-urlencoded',
  85. 'User-Agent': 'Mozilla/5.0'
  86. }
  87. token_exchange = urllib.request.Request(
  88. 'https://discordapp.com/api/oauth2/token',
  89. data = bytes(urllib.parse.urlencode(data).encode()),
  90. headers = headers
  91. )
  92. token_result = urllib.request.urlopen(token_exchange).read()
  93. token_json = json.loads(token_result)
  94. headers = {
  95. 'User-Agent' : 'Mozilla/5.0',
  96. 'Authorization' : 'Bearer ' + token_json['access_token']
  97. }
  98. profile_exchange = urllib.request.Request(
  99. 'https://discordapp.com/api/users/@me',
  100. headers = headers
  101. )
  102. profile_result = urllib.request.urlopen(profile_exchange).read().decode('utf-8')
  103. profile_result_json = json.loads(profile_result)
  104. stand_json = {
  105. 'id' : profile_result_json['id'],
  106. 'name' : profile_result_json['username'] + '#' + profile_result_json['discriminator'],
  107. 'picture' : profile_result_json['avatar']
  108. }
  109. elif platform == 'naver':
  110. token_access = api_url['token'] + '?grant_type=authorization_code&client_id={}&client_secret={}&code={}&state={}'.format(
  111. data['client_id'],
  112. data['client_secret'],
  113. code,
  114. state
  115. )
  116. token_result = urllib.request.urlopen(token_access).read().decode('utf-8')
  117. token_result_json = json.loads(token_result)
  118. headers = {
  119. 'Authorization': 'Bearer {}'.format(token_result_json['access_token'])
  120. }
  121. profile_access = urllib.request.Request(api_url['profile'], headers = headers)
  122. profile_result = urllib.request.urlopen(profile_access).read().decode('utf-8')
  123. profile_result_json = json.loads(profile_result)
  124. stand_json = {
  125. 'id' : profile_result_json['response']['id'],
  126. 'name' : profile_result_json['response']['name'],
  127. 'picture' : profile_result_json['response']['profile_image']
  128. }
  129. elif platform == 'facebook':
  130. token_access = api_url['token'] + '?client_id={}&redirect_uri={}&client_secret={}&code={}'.format(
  131. data['client_id'],
  132. data['redirect_uri'],
  133. data['client_secret'],
  134. code
  135. )
  136. token_result = urllib.request.urlopen(token_access).read().decode('utf-8')
  137. token_result_json = json.loads(token_result)
  138. profile_access = api_url['profile'] + '?fields=id,name,picture&access_token={}'.format(token_result_json['access_token'])
  139. profile_result = urllib.request.urlopen(profile_access).read().decode('utf-8')
  140. profile_result_json = json.loads(profile_result)
  141. stand_json = {
  142. 'id': profile_result_json['id'],
  143. 'name': profile_result_json['name'],
  144. 'picture': profile_result_json['picture']['data']['url']
  145. }
  146. if flask.session['referrer'][0:6] == 'change':
  147. curs.execute('select * from oauth_conn where wiki_id = ? and provider = ?', [flask.session['id'], platform])
  148. oauth_result = curs.fetchall()
  149. if len(oauth_result) == 0:
  150. curs.execute('insert into oauth_conn (provider, wiki_id, sns_id, name, picture) values(?, ?, ?, ?, ?)', [
  151. platform,
  152. flask.session['id'],
  153. stand_json['id'],
  154. stand_json['name'],
  155. stand_json['picture']
  156. ])
  157. else:
  158. curs.execute('update oauth_conn set name = ? picture = ? where wiki_id = ?', [stand_json['name'], stand_json['pricture'], flask.session['id']])
  159. conn.commit()
  160. elif flask.session['referrer'][0:5] == 'login':
  161. curs.execute('select * from oauth_conn where provider = ? and sns_id = ?', [platform, stand_json['id']])
  162. curs_result = curs.fetchall()
  163. if len(curs_result) == 0:
  164. return re_error('/error/2')
  165. else:
  166. flask.session['state'] = 1
  167. flask.session['id'] = curs_result[0][2]
  168. return redirect(flask.session['refer'])