PyGithub 中的 JWT 令牌身份验证问题
Issue with JWT token authentication in PyGithub
我想在 python 中创建一个 github 应用程序,但我卡在了身份验证部分。由于默认不支持 python ,我不得不使用第三方库。生成 JWT 令牌后,我可以使用 curl 成功进行身份验证,但不能使用库进行身份验证。
我试过使用 PyGithub 和 Github.py,但都返回了 "Bad credentials" 错误,所以我一定是忽略了什么。
import jwt
from github import Github
from dotenv import load_dotenv
load_dotenv()
GITHUB_PRIVATE_KEY = os.getenv('GITHUB_PRIVATE_KEY')
GITHUB_APP_IDENTIFIER = os.getenv('GITHUB_APP_IDENTIFIER')
GITHUB_WEBHOOK_SECRET = os.getenv('GITHUB_WEBHOOK_SECRET')
message = {'iat': int(time.time()),
'exp': int(time.time()) + (10 * 60),
'iss': GITHUB_APP_IDENTIFIER}
token = jwt.encode(message, GITHUB_PRIVATE_KEY.strip().encode(), 'RS256')
gh = Github(jwt=token.decode())
for repo in gh.get_user().get_repos():
print(repo.name)
这个 curl 命令 returns 我的应用的详细信息:
curl -i -H "Authorization: Bearer YOUR_JWT" -H "Accept: application/vnd.github.machine-man-preview+json" https://api.github.com/app
我希望代码能够验证并打印我的存储库,但是我得到
Traceback (most recent call last):
File "C:/python/jeev/testing.py", line 21, in <module>
for repo in gh.get_user().get_repos():
File "C:/python/jeev\venv\lib\site-packages\github\PaginatedList.py", line 62, in __iter__
newElements = self._grow()
File "C:/python/jeev\venv\lib\site-packages\github\PaginatedList.py", line 74, in _grow
newElements = self._fetchNextPage()
File "C:/python/jeev\venv\lib\site-packages\github\PaginatedList.py", line 199, in _fetchNextPage
headers=self.__headers
File "C:/python/jeev\venv\lib\site-packages\github\Requester.py", line 276, in requestJsonAndCheck
return self.__check(*self.requestJson(verb, url, parameters, headers, input, self.__customConnection(url)))
File "C:/python/jeev\venv\lib\site-packages\github\Requester.py", line 287, in __check
raise self.__createException(status, responseHeaders, output)
github.GithubException.BadCredentialsException: 401 {'message': 'Bad credentials', 'documentation_url': 'https://developer.github.com/v3'}
Github3.py版本:
import jwt
import github3
from dotenv import load_dotenv
load_dotenv()
GITHUB_PRIVATE_KEY = os.getenv('GITHUB_PRIVATE_KEY')
GITHUB_APP_IDENTIFIER = os.getenv('GITHUB_APP_IDENTIFIER')
GITHUB_WEBHOOK_SECRET = os.getenv('GITHUB_WEBHOOK_SECRET')
gh = github3.github.GitHub()
gh.login_as_app(GITHUB_PRIVATE_KEY.encode(), GITHUB_APP_IDENTIFIER)
gh.me()
引发了相同的 401 错误凭据异常。
我在 login_as_app 函数中包含了一个打印,所以现在它输出 JWT 令牌,我将它与 curl 命令一起使用,我得到了我想要的。奇怪。
RTFM典型案例:我应该是安装认证的
只是为了扩展@ilo 的回答如何作为安装进行身份验证:
import github3
key_file = 'private-key.pem'
GITHUB_PRIVATE_KEY = open(key_file, 'r').read()
GITHUB_APP_IDENTIFIER = "6"
gh = github3.github.GitHub()
# Login as app
gh.login_as_app(GITHUB_PRIVATE_KEY.encode(), GITHUB_APP_IDENTIFIER)
# Login to the installation, assuming only a single one
installations = [installation.id for installation in gh.app_installations()]
gh.login_as_app_installation(GITHUB_PRIVATE_KEY.encode(), GITHUB_APP_IDENTIFIER, installations[0])
# Access information
# e.g. the rate limit
print(gh.rate_limit())
# or access token to checkout the repository
print(gh.session.auth.token)
如果有多个身份验证,可以通过比较 installation.account['login']
和 organization/user 名称来过滤安装。
使用 PyGithub,你使用了 API 错误的
这样就可以了
from github import Github, GithubIntegration
with open("apps-private-key.pem", "r") as secret:
private_key = secret.read()
GITHUB_APP_ID = "1234"
integration = GithubIntegration(
GITHUB_APP_ID, private_key, base_url="https://github.com/api/v3")
install = integration.get_installation("owner", "repository")
access = integration.get_access_token(install.id)
# And here it is :)
print(access.token)
gh = Github(login_or_token=access.token,
base_url="https://github.com/api/v3")
# your operations
我花了一些时间才弄清楚这个序列,PyGithub 的文档缺少一些位。
我想在 python 中创建一个 github 应用程序,但我卡在了身份验证部分。由于默认不支持 python ,我不得不使用第三方库。生成 JWT 令牌后,我可以使用 curl 成功进行身份验证,但不能使用库进行身份验证。
我试过使用 PyGithub 和 Github.py,但都返回了 "Bad credentials" 错误,所以我一定是忽略了什么。
import jwt
from github import Github
from dotenv import load_dotenv
load_dotenv()
GITHUB_PRIVATE_KEY = os.getenv('GITHUB_PRIVATE_KEY')
GITHUB_APP_IDENTIFIER = os.getenv('GITHUB_APP_IDENTIFIER')
GITHUB_WEBHOOK_SECRET = os.getenv('GITHUB_WEBHOOK_SECRET')
message = {'iat': int(time.time()),
'exp': int(time.time()) + (10 * 60),
'iss': GITHUB_APP_IDENTIFIER}
token = jwt.encode(message, GITHUB_PRIVATE_KEY.strip().encode(), 'RS256')
gh = Github(jwt=token.decode())
for repo in gh.get_user().get_repos():
print(repo.name)
这个 curl 命令 returns 我的应用的详细信息:
curl -i -H "Authorization: Bearer YOUR_JWT" -H "Accept: application/vnd.github.machine-man-preview+json" https://api.github.com/app
我希望代码能够验证并打印我的存储库,但是我得到
Traceback (most recent call last):
File "C:/python/jeev/testing.py", line 21, in <module>
for repo in gh.get_user().get_repos():
File "C:/python/jeev\venv\lib\site-packages\github\PaginatedList.py", line 62, in __iter__
newElements = self._grow()
File "C:/python/jeev\venv\lib\site-packages\github\PaginatedList.py", line 74, in _grow
newElements = self._fetchNextPage()
File "C:/python/jeev\venv\lib\site-packages\github\PaginatedList.py", line 199, in _fetchNextPage
headers=self.__headers
File "C:/python/jeev\venv\lib\site-packages\github\Requester.py", line 276, in requestJsonAndCheck
return self.__check(*self.requestJson(verb, url, parameters, headers, input, self.__customConnection(url)))
File "C:/python/jeev\venv\lib\site-packages\github\Requester.py", line 287, in __check
raise self.__createException(status, responseHeaders, output)
github.GithubException.BadCredentialsException: 401 {'message': 'Bad credentials', 'documentation_url': 'https://developer.github.com/v3'}
Github3.py版本:
import jwt
import github3
from dotenv import load_dotenv
load_dotenv()
GITHUB_PRIVATE_KEY = os.getenv('GITHUB_PRIVATE_KEY')
GITHUB_APP_IDENTIFIER = os.getenv('GITHUB_APP_IDENTIFIER')
GITHUB_WEBHOOK_SECRET = os.getenv('GITHUB_WEBHOOK_SECRET')
gh = github3.github.GitHub()
gh.login_as_app(GITHUB_PRIVATE_KEY.encode(), GITHUB_APP_IDENTIFIER)
gh.me()
引发了相同的 401 错误凭据异常。 我在 login_as_app 函数中包含了一个打印,所以现在它输出 JWT 令牌,我将它与 curl 命令一起使用,我得到了我想要的。奇怪。
RTFM典型案例:我应该是安装认证的
只是为了扩展@ilo 的回答如何作为安装进行身份验证:
import github3
key_file = 'private-key.pem'
GITHUB_PRIVATE_KEY = open(key_file, 'r').read()
GITHUB_APP_IDENTIFIER = "6"
gh = github3.github.GitHub()
# Login as app
gh.login_as_app(GITHUB_PRIVATE_KEY.encode(), GITHUB_APP_IDENTIFIER)
# Login to the installation, assuming only a single one
installations = [installation.id for installation in gh.app_installations()]
gh.login_as_app_installation(GITHUB_PRIVATE_KEY.encode(), GITHUB_APP_IDENTIFIER, installations[0])
# Access information
# e.g. the rate limit
print(gh.rate_limit())
# or access token to checkout the repository
print(gh.session.auth.token)
如果有多个身份验证,可以通过比较 installation.account['login']
和 organization/user 名称来过滤安装。
使用 PyGithub,你使用了 API 错误的
这样就可以了
from github import Github, GithubIntegration
with open("apps-private-key.pem", "r") as secret:
private_key = secret.read()
GITHUB_APP_ID = "1234"
integration = GithubIntegration(
GITHUB_APP_ID, private_key, base_url="https://github.com/api/v3")
install = integration.get_installation("owner", "repository")
access = integration.get_access_token(install.id)
# And here it is :)
print(access.token)
gh = Github(login_or_token=access.token,
base_url="https://github.com/api/v3")
# your operations
我花了一些时间才弄清楚这个序列,PyGithub 的文档缺少一些位。