在你的 php 代码中你可以进行 jsonrpc 调用/web/session/authenticate
并接收响应中的session_id。您可以在重定向中将 session_id 作为 url 的哈希值传递。在 odoo 中创建一个页面,使用 javascript 读取哈希值并写入 cookie"session_id=733a54f4663629ffb89d3895f357f6b1715e8666"
(显然是一个例子)到您的 odoo 页面上的浏览器。此时,您应该能够以您在 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 更新这篇文章。但原则仍然成立。只需将这个curl转换为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.ini 中获得的 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>