2013-12-01 6 views
1

Я использую нижеприведенный фрагмент, чтобы подписать запрос и получить токены запроса для процесса JIRA OAuth.Процесс JIRA OAuth в Python

import base64 
import urlparse 
from tlslite.utils import keyfactory 
import oauth2 as oauth 

consumer_key = 'oauth-sample-consumer' 
consumer_secret = 'dont_care' 

request_token_url = 'https://localhost:8090/jira/plugins/servlet/oauth/request-token' 
access_token_url = 'https://localhost:8090/jira/plugins/servlet/oauth/access-token' 
authorize_url = 'https://localhost:8090/jira/plugins/servlet/oauth/authorize' 

class SignatureMethod_RSA_SHA1(oauth.SignatureMethod): 
    name = 'RSA-SHA1' 

    def signing_base(self, request, consumer, token): 
     if not hasattr(request, 'normalized_url') or request.normalized_url is None: 
      raise ValueError("Base URL for request is not set.") 

     sig = (
      oauth.escape(request.method), 
      oauth.escape(request.normalized_url), 
      oauth.escape(request.get_normalized_parameters()), 
     ) 

     key = '%s&' % oauth.escape(consumer.secret) 
     if token: 
      key += oauth.escape(token.secret) 
     raw = '&'.join(sig) 
     return key, raw 

    def sign(self, request, consumer, token): 
     """Builds the base signature string.""" 
     key, raw = self.signing_base(request, consumer, token) 

     with open('../rsa.pem', 'r') as f: 
      data = f.read() 
     privateKeyString = data.strip() 

     privatekey = keyfactory.parsePrivateKey(privateKeyString) 
     signature = privatekey.hashAndSign(raw) 

     return base64.b64encode(signature) 


if __name__=='__main__': 
    consumer = oauth.Consumer(consumer_key, consumer_secret) 
    client = oauth.Client(consumer) 
    client.set_signature_method(SignatureMethod_RSA_SHA1()) 

    resp, content = client.request(request_token_url, "POST") 
    if resp['status'] != '200': 
     raise Exception("Invalid response %s: %s" % (resp['status'], content)) 

Я добавил открытый ключ к потребительской заявке JIRA. Теперь выполнив выше фрагмент кода всегда дает мне эту ошибку:

Traceback (most recent call last): 
    File "views.py", line 80, in <module> 
    resp, content = client.request(request_token_url, "GET") 
    File "/usr/local/lib/python2.7/dist-packages/oauth2/__init__.py", line 682, in request 
    connection_type=connection_type) 
    File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1570, in request 
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey) 
    File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1317, in _request 
    (response, content) = self._conn_request(conn, request_uri, method, body, headers) 
    File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1252, in _conn_request 
    conn.connect() 
    File "/usr/local/lib/python2.7/dist-packages/httplib2/__init__.py", line 1044, in connect 
    raise SSLHandshakeError(e) 
httplib2.SSLHandshakeError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 

Я действительно удалил свой открытый ключ и снова вошел в нее в моем потребительском приложение, чтобы убедиться, что нет пробелов.

JIRA не дает возможности загрузить файл открытого ключа, поэтому его нужно скопировать в любом случае.

ответ

0

Я получил его решить, используя этот пакет certifi

sudo pip install certifi 

В коде:

client.ca_certs = certifi.where() 
Смежные вопросы