This commit is contained in:
Ivan Office
2024-12-05 08:31:04 +08:00
parent eeea2ea78c
commit d15cd7f352

View File

@@ -36,12 +36,13 @@ class ResUsers(models.Model):
@api.model @api.model
def auth_oauth(self, provider, params): def auth_oauth(self, provider, params):
# 这里原生是已取 token实际用 code 时要另取token # 这里原生是已取 token实际用 code 时要另取token
code = params.get('code', False)
access_token = params.get('access_token') access_token = params.get('access_token')
oauth_provider = self.env['auth.oauth.provider'].browse(provider) oauth_provider = self.env['auth.oauth.provider'].sudo().browse(provider)
kw = {} kw = {}
if oauth_provider.code_endpoint and oauth_provider.scope.find('odoo') >= 0: if oauth_provider.code_endpoint and code and not access_token:
# odoo 特殊处理用code取token # odoo 特殊处理用code取token
if not access_token and params.get('code'):
params.update({ params.update({
'scope': oauth_provider.scope or '', 'scope': oauth_provider.scope or '',
'client_id': oauth_provider.client_id or '', 'client_id': oauth_provider.client_id or '',
@@ -54,11 +55,32 @@ class ResUsers(models.Model):
if response.ok: if response.ok:
ret = response.json() ret = response.json()
kw = {**ret, **params} kw = {**ret, **params}
kw.pop('code') kw.pop('code', False)
self = self.with_context(auth_extra=kw) self = self.with_context(auth_extra=kw)
res = super(ResUsers, self).auth_oauth(provider, kw) res = super(ResUsers, self).auth_oauth(provider, kw)
return res return res
def _auth_oauth_signin(self, provider, validation, params):
# 用户绑定的额外处理,如果有同 login 用户则直接绑定
# todo: 当前不管多公司,在 social_login 里有更细节判断,后续优化
oauth_provider = self.env['auth.oauth.provider'].sudo().browse(provider)
if oauth_provider and oauth_provider.scope.find('odoo') >= 0:
oauth_uid =validation.get('user_id')
if oauth_uid:
odoo_user = self.sudo().search([('login', '=', oauth_uid)], limit=1)
if odoo_user and not (odoo_user.oauth_access_token and odoo_user.oauth_provider_id and odoo_user.oauth_uid):
vals = {
'oauth_provider_id': provider,
'oauth_access_token': params.get('access_token'),
'oauth_uid': oauth_uid,
}
odoo_user.write(vals)
_logger.info('========= _auth_oauth_signin res.users write%s' % vals)
self._cr.commit()
return odoo_user.user_id.login
res = super(ResUsers, self)._auth_oauth_signin(provider, validation, params)
return res
def _create_user_from_template(self, values): def _create_user_from_template(self, values):
# 处理odooapp.cn 为 server 时 默认为内部用户 # 处理odooapp.cn 为 server 时 默认为内部用户
oauth_provider_id = values.get('oauth_provider_id') oauth_provider_id = values.get('oauth_provider_id')