我有一个要求,我需要从外部php系统重定向到Odoo,用户也应该登录。我想到了以下两种方法来完成这项工作:
来自php端的url重定向调用特定控制器,并沿着url传递凭据,这显然不是一个安全选项
使用php中的xmlrpc调用方法,并从php传递必要的参数,使用参数登录,然后在此处的方法中进行重定向调用。将不得不进一步检查此方法是否有效,因为当涉及到odoo中的重定向时,控制器和普通函数以不同的方式工作。
请建议哪种方式会更好或是否有其他方法可以更简单地完成此操作。并且,在openerp / service / common.py中添加一个新方法并调用该方法是否有意义,然后是否可以从那里重定向到登录页面的odoo?
希望获得上述内容的输入,我也希望这有助于在Odoo中经常使用的其他外部系统集成查询。
谢谢和问候, Yaseen Shareef
答案 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>