【Python】Kerberos环境下Python的接口调用

Kerberos

Kerberos 是一个用于服务请求时在服务端和客户端进行身份认证的服务,Kerberos支持在所有操作系统上进行构建,包括有 Windows、macOS、FrssBSD 和 Linux。

官方网址:https://www.kerberos.org/

1.Kerberos 环境

Kerberos 环境下访问远程主机的服务,需要在主机上先进行认证,然后才可以携带 kerbeors 主机和 keytab 文件访问。

1.1 Kerbero 主机认证
# keytab_file:keytab文件路径
# kerberos_principal:kerbeors的principal
kinit -kt <keytab_file> <kerberos_principal>

1.2 Kerberos环境下的curl
# method:请求方法,例如GET、POST、PUT...
# negotiate:指定kerberos环境,会携带当前主机认证的kerberos principal进行访问
# username:用户名
# password:密码
# url:要请求的服务地址
curl -X <method> --negotiate -u <username>:<password> -i url

2.Python

2.1 第三方包安装
pip install requests
pip install requests_kerberos
pip install krbcontext
2.2 工具类

这里以 Python 调用 Hadoop 的 Rest 接口为例,测试 Python 在 Kerberos 环境下的服务调用。

Hadoop Rest 接口文档地址:https://hadoop.apache.org/docs/r1.0.4/webhdfs.html

# -*- coding=utf-8 -*-
import json
import logging
import requests
import posixpath
from requests.auth import HTTPBasicAuth
from requests_kerberos import HTTPKerberosAuth
from krbcontext import krbContext

_NAMENODE_STATUS_URL = 'jmx'
_HDFS_REST_URL = 'webhdfs/v1'
_ACCEPT_CONTENT_TYPE = 'application/json'

LOG = logging.getLogger(__name__)


class HdfsRestApi(object):
    """
    HDFS Rest 接口工具类
    """

    def __init__(self, url, username, password, security_enabled=False, principal=None, keytab_file=None):
        self._url = posixpath.join(url)
        self._username = username
        self._password = password
        self._security_enabled = security_enabled
        self._auth = HTTPBasicAuth(self._username, self._password)
        if self._security_enabled:
            with krbContext(using_keytab=True, principal=principal, keytab_file=keytab_file):
                self._auth = HTTPKerberosAuth()

    def __str__(self):
        return "HDFS Rest Url Address Is {HDFS_REST_URL}".format(HDFS_REST_URL=self._url)

    def _get_params(self, params=None):
        params = params if params is not None else {}
        return params

    def get_namenode_status(self):
        """
        获取NameNode的状态信息
        @return:
        """
        result = {'code': 200, 'message': 'success'}

        url = posixpath.join(self._url, _NAMENODE_STATUS_URL)
        params = self._get_params({"qry": "Hadoop:service=NameNode,name=NameNodeStatus"})

        try:
            response = requests.get(url, params=params, headers={'Accept': _ACCEPT_CONTENT_TYPE}, auth=self._auth)
            if response.status_code == 200:
                result['data'] = json.loads(response.text)
            else:
                result['code'] = response.status_code
                result['message'] = response.text

        except requests.exceptions.RequestException as e:
            result['code'] = 500
            result['message'] = "请求出现异常:{error_message}".format(error_message=e)

        return result

    def get_path_quota(self, path):
        """
        获取路径的配额信息(空间配额)
        @return:
        """
        result = {
            'code': 200,
            'message': 'success'
        }
        path = path[1:] if path.startswith('/') else path
        url = posixpath.join(self._url, _HDFS_REST_URL, path)
        params = self._get_params({"op": "GETQUOTAUSAGE"})

        try:
            response = requests.get(url, params=params, headers={'Accept': _ACCEPT_CONTENT_TYPE}, auth=self._auth)
            if response.status_code == 200:
                result['data'] = json.loads(response.text)
            else:
                result['code&
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值