使用GitLab进行终端身份验证

问题描述 投票:0回答:1

我有一个在终端浏览器中供wetty使用的终端。我想从gitlab对用户进行身份验证,以允许用户与终端进行交互(它在docker容器内。当用户通过身份验证后,我将允许他查看容器终端)。

我正在尝试执行OAuth 2.0,但无法实现。

这就是我尝试过的。

  1. 我在gitlab上创建了一个应用程序。
  2. 获取代码和密码,并使用python脚本进行http调用。
  3. 脚本指示我登录和验证页面。
  4. 我试图获取代码但失败了(我认为它们在代码上没有错误)

现在问题从这里开始。我需要从重定向的url获取身份验证代码以获取访问令牌,但无法弄清楚。我使用了烧瓶库来获取代码。

from flask import Flask, abort, request
from uuid import uuid4
import requests
import requests.auth
import urllib2
import urllib

CLIENT_ID = "clientid"
CLIENT_SECRET = "clientsecret"
REDIRECT_URI = "https://UnrelevantFromGitlabLink.com/console"


def user_agent():

    raise NotImplementedError()

def base_headers():
    return {"User-Agent": user_agent()}


app = Flask(__name__)
@app.route('/')
def homepage():
    text = '<a href="%s">Authenticate with gitlab</a>'
    return text % make_authorization_url()


def make_authorization_url():
    # Generate a random string for the state parameter
    # Save it for use later to prevent xsrf attacks
    state = str(uuid4())
    save_created_state(state)
    params = {"client_id": CLIENT_ID,
              "response_type": "code",
              "state": state,
              "redirect_uri": REDIRECT_URI,       
              "scope": "api"}
    url = "https://GitlapDomain/oauth/authorize?" + urllib.urlencode(params)
    print get_redirected_url(url)
    print(url)
    return url


# Left as an exercise to the reader.
# You may want to store valid states in a database or memcache.
def save_created_state(state):
    pass
def is_valid_state(state):
    return True

@app.route('/console')
def reddit_callback(): 
    print("-----------------")
    error = request.args.get('error', '')
    if error:
        return "Error: " + error
    state = request.args.get('state', '')
    if not is_valid_state(state):
        # Uh-oh, this request wasn't started by us!
        abort(403)
    code = request.args.get('code')
    print(code.json())
    access_token = get_token(code)
    # Note: In most cases, you'll want to store the access token, in, say,
    # a session for use in other parts of your web app.
    return "Your gitlab username is: %s" % get_username(access_token)

def get_token(code):
    client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET)
    post_data = {"grant_type": "authorization_code",
                 "code": code,
                 "redirect_uri": REDIRECT_URI}
    headers = base_headers()
    response = requests.post("https://MyGitlabDomain/oauth/token",
                             auth=client_auth,
                             headers=headers,
                             data=post_data)
    token_json = response.json()
    return token_json["access_token"]


if __name__ == '__main__':
    app.run(host="0.0.0.0",debug=True, port=65010)

我认为我的问题出在我的重定向网址上。因为它只是来自GitLab的不相关链接,并且没有API,所以我可以进行调用。

如果我可以开火

@ app.route('/ console')

Python上的那行我的问题可能会解决。

我需要对我的Python脚本或其他角度进行纠正以解决我的问题。请帮忙。

python-2.7 flask oauth-2.0 gitlab
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.