示例#1
0
class TVM(object):
    """Tokens fetch interface implementation.

    Provides public `fetch_token` method, which should be common
    among various token backend types.
    """
    # Can be taken from class name in case of TVM, but could be inconvenient
    # in less general name formatting rules.
    TYPE = 'TVM'

    def __init__(self, client_id, client_secret, endpoints=None, name='tvm'):
        """TVM

        :param client_id: Integer client identifier.
        :param client_secret: Client secret.
        :param endpoints: TVM service endpoints list in format (host, port).
        :param name: TVM service name, defaults to 'tvm'.
        """
        self._client_id = client_id
        self._client_secret = client_secret

        self._tvm = Service(name, endpoints) if endpoints else Service(name)

    @gen.coroutine
    def fetch_token(self):
        """Gains token from secure backend service.

        :return: Token formatted for Cocaine protocol header.
        """
        grant_type = 'client_credentials'

        channel = yield self._tvm.ticket_full(self._client_id,
                                              self._client_secret, grant_type,
                                              {})
        ticket = yield channel.rx.get()

        raise gen.Return(self._make_token(ticket))

    def _make_token(self, ticket):
        return '{} {}'.format(self.TYPE, ticket)