GitHub Oauth 令牌操作中的 Web 浏览器身份验证
web browser authentication in GitHub Actions for Oauth token
我正在尝试使用 GitHub 操作通过 R 脚本使用 OAuth 2.0 令牌查询 GitHub API。当我 运行 代码时,它在我的本地机器上工作正常,其中浏览器 window 弹出指示“等待浏览器中的身份验证...”,我可以手动关闭。当 运行 通过 GitHub 操作时,工作流挂在“等待浏览器中的身份验证...”,因为它在远程计算机上。
我正在使用带有 httr 库的自定义 R 脚本。 API 凭据存储为我要查询的存储库的秘密。
library(httr)
gh_key <- Sys.getenv('GH_KEY')
gh_secret <- Sys.getenv('GH_SECRET')
# setup app credentials
myapp <- oauth_app(appname = "data-in-r",
key = gh_key,
secret = gh_secret)
# get oauth credentials
github_token <- oauth2.0_token(oauth_endpoints('github'), app = myapp, cache = F)
# use api
gtoken <- config(token = github_token)
# get list of remote files in data folder
req <- GET("https://api.github.com/repos/tbep-tech/piney-point/contents/data", gtoken)
当脚本通过 运行 到 GitHub 操作时,如下所示,我不得不手动取消工作流,因为它挂在浏览器步骤。
是否有跳过浏览器步骤以便在 GitHub 操作上 运行 的解决方法?有问题的回购是 here.
您不能在像 Github Actions 这样的无头环境中使用 OAuth2.0 的三足变体(又名“网络应用程序流”)。
如果你想使用 OAuth(我在下面列出了其他可能性),那么你需要利用 gitlab 所谓的“设备流”。参见 github documentation。
在此流程中,没有重定向到给定的 URL,因此该应用不需要浏览器 window。相反,它向用户显示一个代码。用户必须在固定 URL (https://github.com/login/device) 上输入该代码。一旦完成,应用程序就可以请求身份验证令牌。 (因此应用必须不断轮询,直到用户输入代码)。
不幸的是,httr
没有适合此变体的包装函数,因此您必须自己进行调用。它可以像这样工作:
library(httr)
app_id <- "*redacted*"
r <- POST("https://github.com/login/device/code",
body = list(
client_id = app_id,
scope = "user repo delete_repo" #Scope must be given! https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps
))
device_code <- content(r)$device_code
print(paste0("Enter the code ", content(r)$user_code, " at ", content(r)$verification_uri))
## NOTE: In reality this request has to run in a loop, until the user has entered the code und the request succeeds.
## For the demo we can execute it manually after the code has been entered.
r <- POST("https://github.com/login/oauth/access_token",
body = list(
client_id = app_id,
device_code = device_code,
grant_type = "urn:ietf:params:oauth:grant-type:device_code"
))
token <- content(r)$access_token
## create and delete a private testrepository to check if everything worked
r <-
POST("https://api.github.com/user/repos",
add_headers(Authorization = paste("token", token)),
body = list(name = "testrepo",
private = TRUE,
auto_init = FALSE),
encode = "json")
r <- DELETE(paste0("https://api.github.com/repos/", content(r)$full_name),
add_headers(Authorization = paste("token", token)))
我看到有 httr2
,它为这个流程提供了方便的功能。然而,我从未使用过它,也不知道它是否已经可靠地工作。参见 here。
由于此流程仍然需要用户交互,您最好使用以下变体之一(我不知道它们是否适合您的用例。):
我正在尝试使用 GitHub 操作通过 R 脚本使用 OAuth 2.0 令牌查询 GitHub API。当我 运行 代码时,它在我的本地机器上工作正常,其中浏览器 window 弹出指示“等待浏览器中的身份验证...”,我可以手动关闭。当 运行 通过 GitHub 操作时,工作流挂在“等待浏览器中的身份验证...”,因为它在远程计算机上。
我正在使用带有 httr 库的自定义 R 脚本。 API 凭据存储为我要查询的存储库的秘密。
library(httr)
gh_key <- Sys.getenv('GH_KEY')
gh_secret <- Sys.getenv('GH_SECRET')
# setup app credentials
myapp <- oauth_app(appname = "data-in-r",
key = gh_key,
secret = gh_secret)
# get oauth credentials
github_token <- oauth2.0_token(oauth_endpoints('github'), app = myapp, cache = F)
# use api
gtoken <- config(token = github_token)
# get list of remote files in data folder
req <- GET("https://api.github.com/repos/tbep-tech/piney-point/contents/data", gtoken)
当脚本通过 运行 到 GitHub 操作时,如下所示,我不得不手动取消工作流,因为它挂在浏览器步骤。
是否有跳过浏览器步骤以便在 GitHub 操作上 运行 的解决方法?有问题的回购是 here.
您不能在像 Github Actions 这样的无头环境中使用 OAuth2.0 的三足变体(又名“网络应用程序流”)。
如果你想使用 OAuth(我在下面列出了其他可能性),那么你需要利用 gitlab 所谓的“设备流”。参见 github documentation。
在此流程中,没有重定向到给定的 URL,因此该应用不需要浏览器 window。相反,它向用户显示一个代码。用户必须在固定 URL (https://github.com/login/device) 上输入该代码。一旦完成,应用程序就可以请求身份验证令牌。 (因此应用必须不断轮询,直到用户输入代码)。
不幸的是,httr
没有适合此变体的包装函数,因此您必须自己进行调用。它可以像这样工作:
library(httr)
app_id <- "*redacted*"
r <- POST("https://github.com/login/device/code",
body = list(
client_id = app_id,
scope = "user repo delete_repo" #Scope must be given! https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps
))
device_code <- content(r)$device_code
print(paste0("Enter the code ", content(r)$user_code, " at ", content(r)$verification_uri))
## NOTE: In reality this request has to run in a loop, until the user has entered the code und the request succeeds.
## For the demo we can execute it manually after the code has been entered.
r <- POST("https://github.com/login/oauth/access_token",
body = list(
client_id = app_id,
device_code = device_code,
grant_type = "urn:ietf:params:oauth:grant-type:device_code"
))
token <- content(r)$access_token
## create and delete a private testrepository to check if everything worked
r <-
POST("https://api.github.com/user/repos",
add_headers(Authorization = paste("token", token)),
body = list(name = "testrepo",
private = TRUE,
auto_init = FALSE),
encode = "json")
r <- DELETE(paste0("https://api.github.com/repos/", content(r)$full_name),
add_headers(Authorization = paste("token", token)))
我看到有 httr2
,它为这个流程提供了方便的功能。然而,我从未使用过它,也不知道它是否已经可靠地工作。参见 here。
由于此流程仍然需要用户交互,您最好使用以下变体之一(我不知道它们是否适合您的用例。):