Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import flask
- import patreon
- import json
- import os
- from google.cloud import storage
- app = flask.Flask(__name__)
- CLIENT_ID = "redacted"
- CLIENT_SECRET = "redacted"
- redirectUri = "https://patronauthenticator-sp4uwbgqwa-uc.a.run.app/authenticate"
- loginUri = "https://www.patreon.com/oauth2/authorize?response_type=code&client_id=" + CLIENT_ID + "&redirect_uri=" + redirectUri
- storageClient = storage.Client()
- bucketName = "redacted"
- bucket = storageClient.bucket(bucketName)
- #Where MC redirects players. This will then redirect the user to the Patreon oauth2 authroization site, which will then redirect to /authenticate
- @app.route("/login", methods=["GET"])
- def login():
- args = flask.request.args
- if "mc_uuid" in args:
- mcUsername = args["mc_uuid"]
- return flask.redirect(loginUri + "&state=" + mcUsername)
- else:
- print("Insufficient arguments: required 'mc_uuid'")
- return "Insufficient arguments: required 'mc_uuid'"
- # When Minecraft launches, the game will check if the current user's UUID matches any entry in the authenticated.json file. If they do, we sent a validated response, and if not, we send a not_validated response
- @app.route("/validate", methods = ["GET"])
- def validate():
- args = flask.request.args
- if "mc_uuid" in args:
- mcUUID = args["mc_uuid"]
- file = openBlobFile("authenticated.json", "r")
- try:
- data = json.load(file)
- except:
- data = []
- for object in data:
- if "mc_uuid" in object and object["mc_uuid"] == mcUUID:
- file.close();
- return {
- "result": "validated"
- }
- file.close();
- return {
- "result": "not_validated"
- }
- else:
- print("Insufficient arguments: required 'mc_uuid'")
- return flask.make_response({
- "error": "invalid_arguments"
- }, 400)
- # Now that we have the user's patron code, we can get their email and their pledges. If they have any pledges, we'll add them (and their MC uuid) to a json file
- @app.route("/authenticate", methods=["GET"])
- def authenticate():
- args = flask.request.args
- if "error" not in args:
- if "code" in args and "state" in args:
- patronCode = args["code"]
- mcUUID = args["state"]
- oauthClient = patreon.OAuth(CLIENT_ID, CLIENT_SECRET)
- tokens = oauthClient.get_tokens(patronCode, redirectUri)
- accessToken = tokens["access_token"]
- apiClient = patreon.API(accessToken)
- # Where everything is going wrong
- userResponse = apiClient.fetch_user()
- print("Response:", userResponse)
- if type(userResponse) is dict:
- if "errors" in userResponse:
- return logUserAndDisplayError(None, mcUUID)
- elif type(userResponse) is patreon.jsonapi.parser.JSONAPIParser:
- user = userResponse.data()
- email = user.attribute("email")
- pledges = user.relationship("pledges")
- print("Trying to authenticate:", email)
- print("Users pledges:", pledges)
- pledge = pledges[0] if pledges and len(pledges) > 0 else None
- if pledge != None:
- readFile = openBlobFile("authenticated.json", "r")
- try:
- data = json.load(readFile)
- except:
- data = []
- readFile.close()
- for object in data:
- if "email" in object and object["email"] == email:
- return flask.render_template("error_alreadyvalidated.html"), 302
- data.append({
- "email": email,
- "mc_uuid": mcUUID
- })
- bucket.blob("authenticated.json").delete()
- file = openBlobFile("authenticated.json", "w")
- output = json.dumps(data)
- file.write(output)
- file.close()
- return flask.render_template("success.html"), 302
- else:
- # If somehow, a user gets access to a BETA build and tries to authenticate themselves, log them in a seperate txt file
- return logUserAndDisplayError(email, mcUUID)
- else:
- print("Something went wrong, userReponse:", userResponse)
- return "Something went wrong!"
- else:
- print("Insufficient arguments: required 'code' and 'state'")
- return flask.make_response("Insufficient arguments: required 'code' and 'state'", 400)
- else:
- print("Error:", args["error"])
- return "Error: " + args["error"]
- def logUserAndDisplayError(email, mcUUID):
- file = openBlobFile("nonpatron.txt", "w")
- file.write("\n\n")
- if email is None:
- file.write("No Email\n")
- else:
- file.write("Email: " + email + "\n")
- file.write("MC UUID: " + mcUUID)
- return flask.render_template("error_notapatron.html"), 302
- def openBlobFile(name, method):
- blob = bucket.blob(name)
- return blob.open(method)
- if __name__ == "__main__":
- app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement