У меня есть терминал, который служил в веб-браузере с Wotty. Я хочу аутентифицировать пользователя из gitlab, чтобы позволить пользователю взаимодействовать с терминалом (он находится внутри контейнера докера. Когда пользователь аутентифицируется, я разрешаю ему видеть терминал контейнеров).
Я пытаюсь сделать OAuth 2.0, но не смог достичь.
Это то, что я пытался.
- Я создал приложение на gitlab.
- Получите код и секрет и сделайте http-вызов со скриптом Python.
- Скрипт направил меня на страницу входа в систему и аутентификации.
- Я пытался получить код, но не смог (Ихя думаю, нет ошибки в коде)
Теперь проблема начинается здесь. Мне нужно получить код авторизации из перенаправленного 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')
, то эта строка на Python моя проблема, вероятно, будет решена.
Мне нужно внести исправления в мой скрипт Python или под другим углом, чтобы решить мою проблему. Пожалуйста помоги.