Spaces:
Running
Running
| from datetime import datetime | |
| import jwt | |
| import requests | |
| import base64 | |
| def decode_string(base64_string: str) -> str: | |
| """Decodes a Base64 string. | |
| NOTE: | |
| This workaround was required because .env cannot handle multi-line strings, so it was required to convert it to a single line. There are mutliple ways to achieve the same result. | |
| """ | |
| base64_bytes = base64_string.encode('utf-8') | |
| string_bytes = base64.b64decode(base64_bytes) | |
| string = string_bytes.decode('utf-8') | |
| return string | |
| def get_installation_access_token( | |
| signing_key: str, app_id: str, installation_id: str | |
| ) -> str: | |
| """ | |
| Obtain and return a GitHub installation access token. | |
| Arguments: | |
| signing_key: base64 encoded signing key (you'll get this from the .env) | |
| app_id: The application ID | |
| installation_id: The ID of the app installation. | |
| Returns: | |
| The installation access token obtained from GitHub. | |
| """ | |
| # Refer https://github.com/orgs/community/discussions/48186 | |
| # Refer https://stackoverflow.com/questions/77325437/how-do-i-get-an-github-app-installation-token-to-authenticate-cloning-a-reposito | |
| now = int(datetime.now().timestamp()) | |
| signing_key = decode_string(signing_key) | |
| signing_key = jwt.jwk_from_pem(signing_key.encode()) | |
| payload = {"iat": now, "exp": now + 600, "iss": app_id} | |
| jwt_instance = jwt.JWT() | |
| encoded_jwt = jwt_instance.encode(payload, signing_key, alg="RS256") | |
| response = requests.post( | |
| "https://api.github.com/app/installations/" f"{installation_id}/access_tokens", | |
| headers={ | |
| "Authorization": f"Bearer {encoded_jwt}", | |
| "Accept": "application/vnd.github+json", | |
| "X-GitHub-Api-Version": "2022-11-28", | |
| }, | |
| ) | |
| if not 200 <= response.status_code < 300: | |
| raise RuntimeError( | |
| "Unable to get token. Status code was " | |
| f"{response.status_code}, body was {response.text}." | |
| ) | |
| return response.json()["token"] | |
| if __name__ == "__main__": | |
| import os | |
| print(get_installation_access_token( | |
| os.environ.get('CHATBOT_PUB_KEY'), | |
| os.environ.get('APP_ID'), | |
| os.environ.get('INSTALLATION_ID') | |
| )) |