首页 > 解决方案 > 从资源访问 Concourse REST API

问题描述

我正在尝试编写访问 Concourse 实例的 REST API 以获取信息的自定义 Concourse 资源(在 Python 中)。我被困在登录时获取不记名令牌。问题是当我遵循这个 shell 脚本的要点时

#!/bin/bash

## Variables required  #need to update these to take inputs for getting token per team and target.
CONCOURSE_URL="http://localhost:8080"
CONCOURSE_USER="test"
CONCOURSE_PASSWORD="test"
CONCOURSE_TEAM="test"
CONCOURSE_TARGET="my-concourse"

function get_token() {
  ## Create a file named token that will be used to read and write tokens
  touch token

  ## extract the LDAP authentication url and write to token file
  LOCAL_AUTH_URL=$CONCOURSE_URL$(curl -b token -c token -L "$CONCOURSE_URL/sky/login" -s | grep "/sky/issuer/auth/local" | awk -F'"' '{print $4}')
  echo "url is $LOCAL_AUTH_URL"
  # login using username and password while writing to the token file
  curl -s -o /dev/null -b token -c token  -L --data-urlencode "login=$CONCOURSE_USER" --data-urlencode "password=$CONCOURSE_PASSWORD" "$LOCAL_AUTH_URL"

  ATC_BEARER_TOKEN=`grep 'Bearer' token | cut -d\   -f2 | sed 's/"$//'`
  echo $ATC_BEARER_TOKEN
}

涉及到许多重定向,至少其中一些将大厅实例称为http://localhost:8080,这在资源的 docker 容器内部不起作用。

所以我想参数化外部基本 url 并在资源配置中明确给出它。手动处理重定向并将本地 IP 重写为 URL 在最后一个“批准”步骤失败,代码为 400,可能是因为它看起来像是某种跨域攻击。

环境变量 ATC_EXTERNAL_URL 始终是 localhost:8080 我怀疑在形成重定向 url 时也会使用它。这可以设置在某个地方吗?

我不擅长 golang,但在我看来https://github.com/concourse/concourse-pipeline-resource调用 fly 二进制文件以从资源内部实现某种登录。不能说我能得到它的作用和方法。

所有帮助表示赞赏...

标签: concourseconcourse-flyconcourse-resource-types

解决方案


env var$ATC_EXTERNAL_URL很可能对应于您启动 Concourse 时指定的外部 url,所以是的,它可以(并且如果您使用 Github 或 OAuth 等外部身份验证,则必须)更改。您假设它用于构造回调 URL 是正确的。

此外,我不想成为 That Guy(TM),但 Concourse REST API 不是公开的,随时可能更改。你想做什么,你不能从flyCLI 得到什么?您的资源可以在ATC_EXTERNAL_URL需要时调用来获取 fly CLI,然后以这种方式执行命令。


推荐阅读