从外部php系统登录Odoo

时间:2016-09-21 06:39:58

标签: python openerp xml-rpc odoo-9

我有一个要求,我需要从外部php系统重定向到Odoo,用户也应该登录。我想到了以下两种方法来完成这项工作:

  1. 来自php端的url重定向调用特定控制器,并沿着url传递凭据,这显然不是一个安全选项

  2. 使用php中的xmlrpc调用方法,并从php传递必要的参数,使用参数登录,然后在此处的方法中进行重定向调用。将不得不进一步检查此方法是否有效,因为当涉及到odoo中的重定向时,控制器和普通函数以不同的方式工作。

  3. 请建议哪种方式会更好或是否有其他方法可以更简单地完成此操作。并且,在openerp / service / common.py中添加一个新方法并调用该方法是否有意义,然后是否可以从那里重定向到登录页面的odoo?

    希望获得上述内容的输入,我也希望这有助于在Odoo中经常使用的其他外部系统集成查询。

    谢谢和问候, Yaseen Shareef

1 个答案:

答案 0 :(得分:2)

在您的PHP代码中,您可以对/web/session/authenticate进行jsonrpc调用,并在响应中接收session_id。您可以将session_id作为重定向中url的哈希值传递。在odoo中创建一个页面,使用javascript读取哈希并在你的odoo页面上将cookie "session_id=733a54f4663629ffb89d3895f357f6b1715e8666"(显然是一个例子)写入浏览器。此时,您应该能够在您的PHP代码中作为您进行身份验证的用户在odoo中导航。

    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。然而,原则仍然存在。只需将此卷曲转换为php。

如何通过重定向传递此session_id取决于您。您需要警惕安全问题。因此,请注意不要不安全地传递session_id,否则有人可能会嗅探它并成为您登录的用户。

这是一个示例(未经测试),您将不得不创建类似于我上面提供的curl示例的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中的哈希包含你在php中获得的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>