app.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from __future__ import absolute_import
  2. import json
  3. import os
  4. import six
  5. from flask import Flask, redirect, url_for, request, session
  6. from flask_oauth import OAuth
  7. BASE_URL = os.environ.get('BASE_URL', 'http://dev.getsentry.net:8000')
  8. CLIENT_ID = os.environ.get('CLIENT_ID')
  9. CLIENT_SECRET = os.environ.get('CLIENT_SECRET')
  10. REDIRECT_URI = '/authorized'
  11. SECRET_KEY = 'development key'
  12. DEBUG = True
  13. app = Flask(__name__)
  14. app.debug = DEBUG
  15. app.secret_key = SECRET_KEY
  16. oauth = OAuth()
  17. sentry = oauth.remote_app(
  18. 'sentry',
  19. base_url=BASE_URL,
  20. authorize_url='{}/oauth/authorize/'.format(BASE_URL),
  21. request_token_url=None,
  22. request_token_params={
  23. 'scope': 'project:releases event:read org:read org:write',
  24. 'response_type': 'code'
  25. },
  26. access_token_url='{}/oauth/token/'.format(BASE_URL),
  27. access_token_method='POST',
  28. access_token_params={
  29. 'grant_type': 'authorization_code',
  30. },
  31. consumer_key=CLIENT_ID,
  32. consumer_secret=CLIENT_SECRET,
  33. )
  34. @app.route('/')
  35. def index():
  36. access_token = session.get('access_token')
  37. if access_token is None:
  38. return ('<h1>Who are you?</h1>'
  39. '<p><a href="{}">Login with Sentry</a></p>').format(
  40. url_for('login'),
  41. )
  42. from urllib2 import Request, urlopen, URLError
  43. headers = {'Authorization': 'Bearer {}'.format(access_token)}
  44. req = Request('{}/api/0/organizations/'.format(BASE_URL), None, headers)
  45. try:
  46. res = urlopen(req)
  47. except URLError as e:
  48. if e.code == 401:
  49. # Unauthorized - bad token
  50. session.pop('access_token', None)
  51. return redirect(url_for('login'))
  52. return '{}\n{}'.format(six.text_type(e), e.read())
  53. return ('<h1>Hi, {}!</h1>'
  54. '<pre>{}</pre>').format(
  55. json.loads(session['user'])['email'],
  56. json.dumps(json.loads(res.read()), indent=2),
  57. )
  58. @app.route('/login')
  59. def login():
  60. callback = url_for('authorized', _external=True)
  61. return sentry.authorize(callback=callback)
  62. @app.route(REDIRECT_URI)
  63. @sentry.authorized_handler
  64. def authorized(resp):
  65. if 'error' in request.args:
  66. return ('<h1>Error</h1>'
  67. '<p>{}</p>'
  68. '<p><a href="{}">Try again</a></p>').format(
  69. request.args['error'],
  70. url_for('login'),
  71. )
  72. access_token = resp['access_token']
  73. session['access_token'] = access_token
  74. session['user'] = json.dumps(resp['user'])
  75. return redirect(url_for('index'))
  76. @sentry.tokengetter
  77. def get_access_token():
  78. return session.get('access_token')
  79. def main():
  80. app.run()
  81. if __name__ == '__main__':
  82. main()