微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过HTTPS为Google Source Repository调用git clone时,有没有一种方法可以传递访问令牌

如何解决通过HTTPS为Google Source Repository调用git clone时,有没有一种方法可以传递访问令牌

我一直在尝试使用Google Cloud Functions(python 3.7)来基本上克隆Google Source Repository。我正在使用GitPython库,该Cloud Functions的服务帐户对要克隆的存储库具有 Source Repository Reader 源访问权限。

最初,我尝试将gcloud.sh credential.helper传递给git config,但是似乎Cloud SDK环境中(至少在Python 3.7环境中)未安装Cloud SDK。这是我的代码要点:

from git import Repo
import tempfile

def git_clone():
    
    local_repo = tempfile.gettempdir()+'/localrepo'
    repo = Repo.init(local_repo)
    origin = repo.create_remote('origin','https://source.developers.google.com/p/PROJECT/r/REPO')

    repo.config_writer().set_value("user","name","gsr-to-gcs-backup-function").release()
    repo.config_writer().set_value("user","email","gsr-to-gcs-backup-function@PROJECT.iam.gserviceaccount.com").release()
    repo.config_writer().set_value("credential \"https://source.developers.google.com\"","helper","gcloud.sh").release()

    assert origin.exists()
    assert origin == repo.remotes.origin == repo.remotes['origin']
    
    origin.fetch()

如果在Cloud Functions上运行,该函数将引发以下错误,因为认情况下,如果没有凭据帮助程序, https 方法将要求输入用户名密码

git.exc.GitCommandError:Cmd('git')失败的原因是:退出代码(128) cmdline:git fetch -v origin stderr:'致命:无法读取用户名 对于“ https://source.developers.google.com”:输入/输出错误

我只能找到下面的答案来传递令牌以及 git clone 命令,但它没有回答如何传递令牌:

Clone Google Source Repository without gcloud

如果我从云外壳启动该命令,它将被挂起:

gcloud auth git-helper store --account=YOUR_ACCOUNT --ignore-unkNown $@

以下是我计划使用上述方法实现的类似内容(不是正确的代码):

Repo.clone_from("https://source.developers.google.com/p/PROJECT/r/REPO",tempfile.gettempdir(),multi_options=['--config credential.helper={}'.format(MYTOKEN)],branch='master')

我不想放置SSH密钥作为克隆方法,因为我想稍后将其部署到生产中,并且旋转密钥会很麻烦。

解决方法

询问的用户名不过是服务帐户地址和凭据,可以是临时生成的OAuth 2.0访问令牌。所以,我最终要做的是:

from git import Repo
import tempfile
import urllib.parse
import google.auth
import google.auth.transport.requests

def get_token():
    creds,project = google.auth.default()
    # creds.valid is False,and creds.token is None
    # # Need to refresh credentials to populate those
    auth_req = google.auth.transport.requests.Request()
    creds.refresh(auth_req)
    # Now you can use creds.token
    return creds.token

def url_parse():
    query = 'gsr-to-gcs-backup-function@PROJECT.iam.gserviceaccount.com'
    return urllib.parse.quote(query)

def git_clone():
    encoded_url = url_parse()
    credentials = get_token()
    
    local_repo = tempfile.gettempdir()+'/localrepo' 
    Repo.clone_from(f"https://{encoded_url}:{credentials}@source.developers.google.com/p/PROJECT/r/REPO",local_repo,branch='master')

def main(*args):
    git_clone()

注意:这只是我的代码的一部分。我想要将其复制到GCS存储桶中。但这超出了这个问题的范围。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。