2016-09-21 2 views
1

외부 PHP 시스템에서 Odoo로 리디렉션해야하는 요구 사항이 있으며 사용자도 로그인해야합니다. 나는이 작업이 완료 얻기 위해 다음과 같은 두 가지 방법으로 생각 :외부 PHP 시스템에서 Odoo에 로그인

  1. 특정 컨트롤러를 호출하고, 분명한 이유에 대한 보안 옵션이 아닙니다의 URL, alongiwth 자격 증명을 전달하는 PHP 측에서 URL 리디렉션

  2. php에서 xmlrpc를 사용하고 php에서 필요한 인수를 전달하는 메소드를 호출하고 인수를 사용하여 로그인 한 다음 여기에있는 메소드에서 리디렉션을위한 호출이 이루어집니다. odoo 내에서 리다이렉션 (redirections)을 할 때 컨트롤러와 일반 함수가 다른 방식으로 작동하기 때문에이 방법이 작동하는지 더 확인해야합니다.

어느 것이 더 좋을지 제안하거나 더 쉽게 할 수있는 다른 방법이 있습니까? openerp/service/common.py에 새로운 메소드를 추가하고 해당 메소드를 호출하면 거기에서 로그인 한 odoo 페이지로 리디렉션 할 수 있습니까?

위 입력 항목을 참고하여이 기능이 Odoo에서 자주 발생하는 다른 외부 시스템 통합 쿼리에 도움이되기를 바랍니다.

감사 그리고 감사합니다, PHP 코드에서 야신 샤리프

답변

2

당신은 /web/session/authenticate에 JSONRPC 통화를하고 응답에 SESSION_ID를받을 수 있습니다. 리디렉션에서 url의 해시로 session_id를 전달할 수 있습니다. odoo에서 javascript를 사용하여 해시를 읽고 oudoo 페이지의 브라우저에 쿠키 "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> 
+0

안녕 필립, 사용자의 입력에 대한 감사합니다,하지만 실제로는 오히려 Odoo 웹 사이트 페이지를 방문보다 위의 가능성 중 하나를 찾고 있었어요. 그리고 그런 식으로, 나는 파이썬 메서드와 리다이렉션이 그것에 대해가는 길일 것이라고 생각합니다. 하지만이 위치를 정확히 어디에 두어야할지 모르겠다. openerp/service/common.py 또는 Odoo의 모델 중 하나에 새 메소드로 추가하십시오. Odoo에 익숙하다면 위의 지시 사항을 알려주십시오. –

+0

일단 세션이 생기면 애드온의 컨트롤러가 정의한 경로로 리디렉션됩니다. 해시를 읽고 쿠키를 등록 할 수있는 Javascript가있는 페이지를 엽니 다. 쿠키가 등록되면 원하는 odoo 페이지로 리디렉션 할 수 있습니다. 이 모든 일이 너무 빨리 일어나서 사용자는 그것이 일어난 일조차 모르게됩니다. –

+0

내일 예를 더 제공 할 수 있습니다. 컨트롤러와 Javascript를 구현하는 방법. –

관련 문제