>

wetty와 함께 웹 브라우저에서 사용되는 터미널이 있습니다. 터미널과 상호 작용할 수 있도록 gitlab에서 사용자를 인증하고 싶습니다 (도커 컨테이너 내부에 있습니다. 사용자가 인증하면 컨테이너 터미널을 볼 수 있습니다).

OAuth 2.0을 시도하고 있지만 달성 할 수 없었습니다.

그것이 내가 시도한 것입니다.

<올>
  • gitlab에서 응용 프로그램을 만들었습니다.
  • 코드와 비밀을 얻고 파이썬 스크립트로 http를 호출하십시오.
  • 스크립트에서 로그인 및 인증 페이지로 이동했습니다.
  • 코드를 얻으려고했지만 실패했습니다 (제 생각에는 코드에 실수가 없습니다)
  • 이제 여기서 문제가 시작됩니다. 액세스 토큰을 얻으려면 리디렉션 된 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)
    
    

    문제가 리디렉션 URL에 있다고 생각합니다. 그것은 GitLab과 관련이 없으며 API가 없기 때문에 호출 할 수 있습니다.

    해고 할 수 있다면

    @app.route('/console')

    파이썬에서 내 문제는 아마 해결 될 것이다.

    문제를 해결하려면 파이썬 스크립트 나 다른 각도로 수정해야합니다. 도와주세요.

    • 답변 # 1

      auth2의 개념을 완전히 이해하지 못했습니다. 주요 목표는 access_token을 갖는 것입니다. 콜백 URL을 localhost로 수정하면 매력처럼 작동했습니다.

  • 이전 reactjs - Javascript 객체에서 동적으로 배열 목록 만들기
  • 다음 Python - 파이썬 - 문자열을 여러 번 연결