0

我正在尝试设置一个本地无人机服务器作为我们的 CI 环境。我们的源代码由 Github 管理。首先,我在 Github 上创建一个 oauth 应用程序并获取 client_id 和 client_secret。然后安装docker和drone,之后我做了下面的配置/etc/drone/dronerc

REMOTE_DRIVER=github
REMOTE_CONFIG=https://github.com?client_id=XXXXXX&client_secret=XXXXXX
DATABASE_DRIVER=sqlite3
DATABASE_CONFIG=/var/lib/drone/drone.sqlite

然后我运行下面的命令来启动无人机 docker 容器:

sudo docker run \
  --volume /var/lib/drone:/var/lib/drone \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --env-file /etc/drone/dronerc \
  --restart=always \
  --publish=80:8000 \
  --detach=true \
  --name=drone \
  drone/drone:0.4

我在浏览器上访问无人机链接,我可以看到一个登录按钮。如下所示。

在此处输入图像描述

当我点击登录按钮时,我的回调 url 会收到以下错误消息通知:

error=redirect_uri_mismatch&error_description=The+redirect_uri+MUST+match+the+registered+callback+URL+for+this+application.

下面是 Github 回调 url 的服务器代码:

get '/oauth/authorize' do
  # get temporary GitHub code...
  session_code = request.env['rack.request.query_hash']['code']

  # ... and POST it back to GitHub
  result = RestClient.post('https://github.com/login/oauth/access_token',
                          {:client_id => CLIENT_ID,
                           :client_secret => CLIENT_SECRET,
                           :code => session_code},
                           :accept => :json)

  # extract the token and granted scopes
  access_token = JSON.parse(result)['access_token']
  redirect 'http://10.0.0.24/'
end

在上述代码的最后一行,重定向地址为无人机服务器地址。我可能在 OAuth 身份验证部分做错了事,但我不知道如何以正确的方式做到这一点。有谁知道如何实现该部分以允许无人机访问我的 Github 帐户?

谢谢

4

1 回答 1

1

当您在 GitHub 中创建 Drone 应用程序时,有一个重定向 url 字段应设置为类似http://hostname.com/authorize

在执行 oauth 流程时,Droneredirect_url会向 GitHub 提供一个查询参数,指示成功登录后重定向到哪里。以下错误消息表明redirect_url查询参数与 GitHub 中配置的参数不匹配

+redirect_uri+MUST+match++注册+回调+URL+for+this+应用

来自 github 文档

如果您提供的 redirect_uri 与您在应用程序中注册的内容不匹配,GitHub 将重定向到注册的回调 URL,并使用以下参数总结错误

请注意,这些值必须完全匹配。即使是简单的 http 与 https 不匹配也会导致错误。

由于 Drone 是用 Go 编写的,因此 Ruby 代码的用途有点不清楚。所以不幸的是,这不是我能够评论的。

我可以说最常见的错误是错误地配置了重定向 url,或者在没有配置X-Forwarded-ForX-Forwarded-Proto文档的情况下在反向代理后面运行 Drone。当 Drone 在反向代理后面运行时,Drone 使用这些值来确定它自己的 URL,然后在设置redirect_url值时使用该 URL。

于 2016-12-13T16:09:24.330 回答