2016-09-21 2 views
1

У меня есть требование, когда мне нужно перенаправить из внешней php-системы в Odoo, и пользователь должен также войти в систему. Я думал, что из двух способов, чтобы получить это сделано:Вход в Odoo из внешней php-системы

  1. URL-адрес перенаправления со стороны PHP, который вызывает конкретный контроллер, и передать полномочия alongiwth URL-адрес, который не является безопасным вариантом по понятным причинам

  2. Вызов метода с использованием xmlrpc из php и передача необходимых аргументов вместе с php, использование аргументов для входа, а затем в методе здесь выполняется вызов для перенаправления. Необходимо будет дополнительно проверить, будет ли этот метод работать, поскольку контроллер и обычные функции работают по-разному, когда дело доходит до перенаправления внутри odoo.

Просьба указать, в каком направлении было бы лучше, или есть ли другие способы сделать это, что может быть проще. И было бы целесообразно добавить новый метод в openerp/service/common.py и вызвать этот метод, и тогда будет ли возможность перенаправлять на страницу с одинарной регистрацией?

Надеемся на ввод данных выше, и я также надеюсь, что это поможет другим запросам системной интеграции, которые часто встречаются в Odoo.

Спасибо и наилучшие пожелания, Ясин Shareef

ответ

2

В коде PHP можно сделать jsonrpc вызов /web/session/authenticate и получить session_id в ответ. Вы можете передать session_id как хэш вашего URL-адреса при перенаправлении. Создайте страницу в odoo, которая использует javascript для чтения хэша и напишет файл cookie "session_id=733a54f4663629ffb89d3895f357f6b1715e8666" (очевидно, пример) вашему браузеру на странице вашего сайта. На этом этапе вы сможете перемещаться в оду, как пользователь, который вы аутентифицировали, как в вашем php-коде.

from requests import Request,Session 
    import json 

    base_url = "127.0.0.1:8069" 
    url = "%s/web/session/authenticate" % base_url 
    db = <db_name> 
    user = <login> 
    passwd = <password> 

    s = Session() 

    data = { 
     'jsonrpc': '2.0', 
     'params': { 
      'context': {}, 
      'db': db, 
      'login': user, 
      'password': passwd, 
     }, 
    } 

    headers = { 
     'Content-type': 'application/json' 
    } 

    req = Request('POST',url,data=json.dumps(data),headers=headers) 
    prepped = req.prepare() 
    resp = s.send(prepped) 

    r_data = json.loads(resp.text) 
    session_id = r_data['result']['session_id'] 

В этом примере используется ванильный локон. Я знаю, что это не php, но я могу обновить это сообщение позже для php. Однако принцип все же остается. Просто преобразуйте этот curl в php.

Как вы проходите этот сеанс с перенаправлением, зависит от вас. Есть проблемы с безопасностью, о которых вам нужно будет опасаться. Поэтому будьте осторожны, чтобы не пройти session_id небезопасно, или кто-то может обнюхать его и стать зарегистрированным пользователем.

Это пример (непроверенный), вам нужно будет создать строку, закодированную json, подобную приведенному выше примеру скручивания. Надеюсь это поможет.

$data = <your_json_data> 
$data_string = json_encode($data);                     

$ch = curl_init('http://127.0.0.1:8069/web/session/authenticate');                  
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                  
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                  
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                   
    'Content-Type: application/json',                     
    'Content-Length: ' . strlen($data_string))                  
);                             

$result = curl_exec($ch); 

После того, как ваш session_id вы будете перенаправлены на ваш odoo сервера на маршрут, который обрабатывается контроллером в вашем аддоне.

Контроллер

imports ... 

class MyAddon(http.Controller): 

@http.route('/path/for/controller', type='http', auth='public', website=True) 
def ext_login_redirect(self, **kw): 
    return http.request.render('myaddon.template',{}) 

Важной частью является то, что хэш в URL содержит session_id вы получили в РНР.

Шаблон your_template.xml

<openerp> 
    <data> 
     <template id="template" name="Redirect Template" page="True"> 
      document.cookie = "session_id=" + window.location.hash; 
      window.location = "127.0.0.1:8069/web"; 
     </template> 
    </data> 
</openerp> 
+0

Привет Филип, Спасибо за ваши входы, но я был на самом деле смотрит на одну из перечисленных выше возможностей, а не посадка их на странице сайта Odoo. И таким образом, я предполагаю, что метод python и перенаправление от этого будут способом обойти это. Но я все еще не понимаю, где разместить это в точности, добавьте его как новый метод в openerp/service/common.py или в одну из моделей в Odoo. Не могли бы вы указать указатели в указанном выше направлении, если вы знакомы с Оду? –

+0

Как только у вас будет сеанс, я бы переадресовал маршрут, определенный контроллером в вашем добавлении. Откройте страницу, на которой просто есть Javascript, который может читать ваш хэш и регистрировать cookie. Как только cookie зарегистрирован, вы можете переадресовать на любую страницу окуни, которую вы хотите. Все это должно произойти так быстро, что пользователь не узнает, что это произошло. –

+0

Я могу привести следующий пример завтра. О том, как реализовать контроллер и Javascript. –

Смежные вопросы