Salesforce cometD: 401 :: Запрос требует аутентификации - PullRequest
0 голосов
/ 29 мая 2018

Я должен подписаться на канал CometD Salesforce и, следовательно, собирать клиента cometD на python.Я использую приведенную ниже библиотеку python.

https://github.com/dkmadigan/python-bayeux-client

И ниже приведен ответ на рукопожатие, которое я получаю

{'Host': ['xxxxx.my.salesforce.com/cometd/42.0/'], 'Content-Type': ['application/x-www-form-urlencoded'], 'Authorization': ['admin@123Pi6s9Y2QVergfergregpqqY']} message={"channel":"/meta/handshake","id":"1",
            "supportedConnectionTypes":["callback-polling", "long-polling"],
            "version":"1.0","minimumVersion":"1.0"} Headers({'host': ['xxxxx.my.salesforce.com/cometd/42.0/'], 'content-type': ['application/x-www-form-urlencoded'], 'authorization': ['admin@123Pi6s9Y2QVergfergregpqqY']}) {u'successful': False, u'advice': {u'reconnect': u'none'}, u'ext': {u'replay': True, u'sfdc': {u'failureReason': u'401::Request requires authentication'}, u'payload.format': True}, u'error': u'403::Handshake denied', u'id': u'1', u'channel': u'/meta/handshake'}

И я получаю 401 :: Запрос требуетАутентификация.

В ключе авторизации я сцепил пароль и токен доступа, то есть admin @ 123Pi6s9Y2QVergfergregpqqY, где admin @ 123 - пароль, который я использую для входа в Salesforce.

Я бился головойс 2 дня, но не в состоянии выяснить, почему рукопожатие терпит неудачу.Какие-либо предложения?

1 Ответ

0 голосов
/ 29 мая 2018

Я считаю, что ключ авторизации неверен.Ожидается не ваш пароль, а токен доступа OAuth или идентификатор сеанса, который вы получаете после входа в систему Salesforce.См. Различные потоки OAuth , если вы тестируете, вы можете использовать поток пароля имени пользователя.

Следующий метод, который вы можете использовать для получения идентификатора сеанса при необходимости

import requests
import json

LOGIN_INSTANCE_URL = 'https://test.salesforce.com/services/oauth2/token'
LOGIN_USER_NAME = 'username_here'
CLIENT_ID = 'connected app consumer key'
CLIENT_SECRET = 'connected app consumer secret'
PASSWORD = 'password token'

def connect(authUrl, clientId, secret, username, password):
    headers = {
            }        
    postBody = { 
                'grant_type': 'password',
                'client_id': clientId,
                'client_secret':secret,
                'username': username,
                'password': password
            }
    try:
        response = requests.post(authUrl, data = postBody, headers = headers)
        #response.raise_for_status()
        if (response.status_code == 200):
            authResponse = response.json()
            return authResponse['access_token']
        else: #if not 200 see what the problem was
            print response.text  
    except requests.exceptions.RequestException as e:  
        print e

print(connect(LOGIN_INSTANCE_URL, CLIENT_ID, CLIENT_SECRET, LOGIN_USER_NAME, PASSWORD))

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

...