как получить новый токен доступа с помощью auth0 и refre sh token на bitbucket - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь получить новый токен доступа, используя токен refre sh, используя Auth0 на провайдере Bitbucket. Согласно документации Bitbucket, для получения нового токена доступа используется токен refre sh вдоль client_id и secret клиента.

curl -X POST -u "client_id:secret"
      https://bitbucket.org/site/oauth2/access_token \
      -d grant_type=refresh_token -d refresh_token={refresh_token}

Но похоже, что для этого я должен использовать Auth0 в качестве прокси , В документации Auth0 говорится, что нужно использовать токен refre sh (определяемый пользователем c) вместе с моим доменом Auth0 и идентификатором клиента Auth0. Кажется немного странным смешивать мои учетные данные Auth0 с токеном refre sh для пользователя Bitbucket.

https://auth0.com/docs/tokens/concepts/idp-access-tokens?_ga=2.56840622.505323938.1583403242-2086121138.1583403242#renew - токены

Это мой поток:

(1) установить информацию клиента AUTH0

  • установить идентификатор клиента auth0
  • установить секрет клиента auth0
  • установить домен auth0
  • получить маркер клиента auth0

(2) получить начальную информацию о пользователе

получить информацию о пользователе в конечной точке:

https://<auth0_domain>.auth0.com/api/v2/users/<user_id>

  • это будет содержать токен доступа для пользователя
  • это также будет содержать refre sh токен для «пользователя», а не клиента AUTH0 (я полагаю?)

(3) попытаться получить токен доступа из refre sh токен

использовать refre sh токен для получения токена доступа здесь:

https://<auth0_domain>.auth0.com/oauth/token

Примечательно, что токен refre sh предназначен для пользователя, но информация о клиенте получена от клиента AUTH0 - для меня это не имеет смысла , с этой ошибкой это не получится.

{u'error_description': u'Unauthorized', u'error': u'access_denied'}

По существу это не сработает:

payload = { "client_id": self.auth0_client_id,
                            "client_secret": self.auth0_client_secret,
                            "refresh_token": kwargs["refresh_token"].decode("utf-8"),
                            "grant_type": "refresh_token" }

        _endpt = 'https://{}.auth0.com/oauth/token'.format(self.auth0_domain)
        headers = {'content-type': 'application/json'}

        req = requests.post(_endpt,
                            data=json.dumps(payload),
                            headers=headers)

Ниже приведен весь код моего класса в python.

#!/usr/bin/env python

    import json
    import os
    import requests
    import logging

    class Auth0Client(object):

        def __init__(self,**kwargs):

            self.classname = "Auth0Client"
            self.logger.logging.basicConfig(level=logging.INFO)

            # (1) set AUTH0 client info

            self.auth0_client_id = os.environ["AUTH0_CLIENT_ID"]
            self.auth0_client_secret = os.environ["AUTH0_CLIENT_SECRET"]
            self.auth0_domain = os.environ["AUTH0_DOMAIN"]
            self._set_auth0_client_token()

        def _set_auth0_client_token(self):

            payload = { "client_id": self.auth0_client_id,
                        "client_secret": self.auth0_client_secret,
                        "audience": "https://{}.auth0.com/api/v2/".format(self.auth0_domain),
                        "grant_type": "client_credentials" }

            api_endpoint = 'https://{}.auth0.com/oauth/token'.format(self.auth0_domain)

            req = requests.post(api_endpoint,
                                data=json.dumps(payload),
                                headers={'content-type': 'application/json'})

            self.auth0_client_token = req.json()["access_token"].decode("utf-8")

        def _get_userinfo_frm_auth0(self,user):

            endpoint = "https://{}.auth0.com/api/v2/users/{}".format(self.auth0_domain,user)
            headers = {'Authorization': 'Bearer %s' % self.auth0_client_token}
            req = requests.get(endpoint,headers=headers)

            return req.json()

        def _get_user_access_token_with_refresh(self,**kwargs):

            payload = { "client_id": self.auth0_client_id,
                        "client_secret": self.auth0_client_secret,
                        "refresh_token": kwargs["refresh_token"].decode("utf-8"),
                        "grant_type": "refresh_token" }

            _endpt = 'https://{}.auth0.com/oauth/token'.format(self.auth0_domain)
            headers = {'content-type': 'application/json'}

            req = requests.post(_endpt,
                                data=json.dumps(payload),
                                headers=headers)

            return req.json()["access_token"].decode("utf-8")

        def get_user_access_token(self,user):

            # (2) get initial user info
            user_info = self._get_userinfo_frm_auth0(user)

            if str(user_info["identities"][0]["provider"]) == "bitbucket":
                # (3) try to get access token from refresh token
                user_token = self._get_user_access_token_with_refresh(user=user,**user_info["identities"][0])
            else:
                user_token = user_info["identities"][0]["access_token"].decode("utf-8")

            return user_token

1 Ответ

0 голосов
/ 09 марта 2020

Я понял это с помощью сообщества auth0. я отправил решение и поток здесь, если что-нибудь нужно:

https://github.com/gear2000/auth0-bitbucket

...