app.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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={"grant_type": "authorization_code"},
  29. consumer_key=CLIENT_ID,
  30. consumer_secret=CLIENT_SECRET,
  31. )
  32. @app.route("/")
  33. def index():
  34. access_token = session.get("access_token")
  35. if access_token is None:
  36. return ("<h1>Who are you?</h1>" '<p><a href="{}">Login with Sentry</a></p>').format(
  37. url_for("login")
  38. )
  39. from urllib2 import Request, urlopen, URLError
  40. headers = {"Authorization": "Bearer {}".format(access_token)}
  41. req = Request("{}/api/0/organizations/".format(BASE_URL), None, headers)
  42. try:
  43. res = urlopen(req)
  44. except URLError as e:
  45. if e.code == 401:
  46. # Unauthorized - bad token
  47. session.pop("access_token", None)
  48. return redirect(url_for("login"))
  49. return "{}\n{}".format(six.text_type(e), e.read())
  50. return ("<h1>Hi, {}!</h1>" "<pre>{}</pre>").format(
  51. json.loads(session["user"])["email"], json.dumps(json.loads(res.read()), indent=2)
  52. )
  53. @app.route("/login")
  54. def login():
  55. callback = url_for("authorized", _external=True)
  56. return sentry.authorize(callback=callback)
  57. @app.route(REDIRECT_URI)
  58. @sentry.authorized_handler
  59. def authorized(resp):
  60. if "error" in request.args:
  61. return ("<h1>Error</h1>" "<p>{}</p>" '<p><a href="{}">Try again</a></p>').format(
  62. request.args["error"], url_for("login")
  63. )
  64. access_token = resp["access_token"]
  65. session["access_token"] = access_token
  66. session["user"] = json.dumps(resp["user"])
  67. return redirect(url_for("index"))
  68. @sentry.tokengetter
  69. def get_access_token():
  70. return session.get("access_token")
  71. def main():
  72. app.run()
  73. if __name__ == "__main__":
  74. main()