首页 > 其他分享 >使用钉钉Oauth2授权登录Odoo配置

使用钉钉Oauth2授权登录Odoo配置

时间:2024-07-04 12:43:21浏览次数:27  
标签:Oauth2 dingtalk 登录 Odoo auth token code provider oauth

准备工作

需要用到的模块:
Odoo/auth_oauth
OCA/server-auth/auth_oidc

因为钉钉的Oauth授权流程比较特殊,需要继承改造res.users上的几个方法

models\res_users.py



class ResUsers(models.Model):
    _inherit = "res.users"

    dingtalk_userid = fields.Char('Dingtalk User ID', copy=False)

    # 授权回调后换取acccess_token
    def _auth_oauth_get_tokens_auth_code_flow(self, oauth_provider, params):
        if 'dingtalk' in oauth_provider.auth_endpoint:
            # https://openid.net/specs/openid-connect-core-1_0.html#AuthResponse
            code = params.get("code")
            # https://openid.net/specs/openid-connect-core-1_0.html#TokenRequest
            auth = None
            if oauth_provider.client_secret:
                auth = (oauth_provider.client_id, oauth_provider.client_secret)
            response = requests.post(
                oauth_provider.token_endpoint,
                json=dict(
                    clientId=oauth_provider.client_id,
                    clientSecret=oauth_provider.client_secret,
                    grantType="authorization_code",
                    code=code,
                ),
                auth=auth,
                timeout=10,
            )
            response.raise_for_status()
            response_json = response.json()
            # https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse
            return response_json.get("accessToken"), response_json.get("refreshToken")
        else:
            return super()._auth_oauth_get_tokens_auth_code_flow(oauth_provider, params)

    @api.model
    def auth_oauth(self, provider, params):
        oauth_provider = self.env["auth.oauth.provider"].browse(provider)
        if oauth_provider.flow == "id_token_code" and 'dingtalk' in oauth_provider.auth_endpoint:
            access_token, refresh_token = self._auth_oauth_get_tokens_auth_code_flow(
                oauth_provider, params
            )
            if not access_token:
                _logger.error("No access_token in response.")
                raise AccessDenied()
            # 获取unionid
            resp = requests.get(oauth_provider.validation_endpoint, headers={'x-acs-dingtalk-access-token': access_token})

            res = resp.json()
            if resp.status_code != 200:
                _logger.error("Failed to get user info.\n" % res)
                raise AccessDenied()
            # 通过unionid换取钉钉用户id
            dingtalk_userid = self.env['dingtalk.client'].get_userid_by_unionid(res['unionId'])
            if not dingtalk_userid:
                raise AccessDenied()
            # 查询内部用户
            user_id = self.env['res.users'].sudo().search([('dingtalk_userid', '=', dingtalk_userid)], limit=1)
            if not user_id.login:
                raise AccessDenied()
            user_id.write({'oauth_uid': res['unionId'], 'oauth_access_token': access_token})
            self.delete_other_session()
            # return user credentials
            return (self.env.cr.dbname, user_id.login, access_token)
        else:
            return super().auth_oauth(provider, params)

需要预先用服务端接口把钉钉的userid同步进odoo上

controllers\oauth_login.py

# -*- coding: utf-8 -*-

from odoo.addons.auth_oauth.controllers.main import OAuthLogin


class DingtalkAuthLogin(OAuthLogin):
    # 针对钉钉授权登录中的prompt参数,配置在auth_endpoint里:https://login.dingtalk.com/oauth2/auth?prompt=consent
    def list_providers(self):
        providers = super().list_providers()
        for provider in providers:
            if provider['auth_link'].count('?') > 1:
                auth_params = provider['auth_link'].split('?')
                provider['auth_link'] = '%s?%s' % (auth_params[0], '&'.join(auth_params[1:]))
        return providers

Oauth配置

配置后的效果

标签:Oauth2,dingtalk,登录,Odoo,auth,token,code,provider,oauth
From: https://www.cnblogs.com/xtanuiha/p/18283641

相关文章

  • openEuler配置ssh登录
    环境:OS:oe2203sp41.步骤1下载新版本的SecureCRT我这里下载的是9.5.2,下载地址如下:https://www.vandyke.com/cgi-bin/releases.php?product=securecrt一般新版本都是没有破解的,下面进行相应的修改配置,让旧版本的也能登录 2.修改sshd配置vi/etc/ssh/sshd_config注释掉如......
  • vue3+node.js+mysql+electron+express实现用户登录,文章写入删除,全量更新,增量更新,和截
    第一件事情是安装node.js,去官网下,在终端node-v,npm-v有版本号就行了,不必搞环境配置,保姆级别教程,感谢哥有时间。嘻嘻,祝大家开心。1.首先你要创建electron项目打开vscode,新建终端输入代码npminit这个代码是初始化的意思会生成一个文件package.json里面的代码应该是这......
  • 微信小程序-详细登录流程 - (图解+代码流程)
    目录项目准备     注册小程序和创建项目一、登录页面效果图头部区域头部区域代码展示布局组件和图片组件的使用弹性布局display:flex;登录内容区域登录内容区域代码展示bindsubmit="uplogin"代码注解切换登录区域切换登录区域代码展示<radio-group/><radio/>......
  • 保持校园网自动登录的代码备忘: 基于webdriver和chrome
    在跑一个处理很多数据的代码,需要不间断地运行。而且最近打算回家一周,需要远程控制电脑。但是学校的校园网每到晚上就会自己断开,干脆写份脚本来保持校园网的连接这份简单的代码只包括三个部分,检测网络状态的部分,自动登录校园网的部分,循环执行的部分、importosimporttimeimpo......
  • 鸿蒙手机号&&验证码登录, 包含倒计时&&号码格式验证码格式校验, 还有 使用 Hyperlink
    1,先看看整体效果                          2,看格式校验效果                            3,代码直接CV  importpromptActionfrom'@ohos.promptA......
  • 手把手带你使用JWT实现单点登录
    JWT(英文全名:JSONWebToken)是目前最流行的跨域身份验证解决方案之一,今天我们一起来揭开它神秘的面纱!一、故事起源说起JWT,我们先来谈一谈基于传统session认证的方案以及瓶颈。传统session交互流程,如下图:当浏览器向服务器发送登录请求时,验证通过之后,会将用户信息存入seesion中......
  • Linux升级软件系统,防止其他用户登录影响升级,可以进行的操作
    题目解析touch/etc/nolgoin:禁止所有普通用户登录iptable-sINPUT-ttcp-s!127.0.0.1-jDROP:屏蔽非127.0.0.1请求;Linux的七个运行级别Linux下的7个运行级别:0:系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭。1:单用户工作状态,root权限,用于系统......
  • Linux统计日志中有多少个不同的IP登录
    题目解析知识点:1、awk-F'''{print$3}'指定空格是分隔符进行分割,取第三个。(不指定默认分隔符也是空格)2、uniq-c(uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。参数-c:进行计数)3、wc-l行......
  • 企业微信自建应用开发-免密登录
    1、基本需求企业微信账号可信域名和服务器2、创建自建应用企业微信点击应用管理下滑找到自建应用填写名称和权限和上传应用头像3、构建路径点击打开刚刚的自建应用企业需要在打开的网页里面携带用户的身份信息直接进行免登录操作,第一步需要构造如下的链接来获取co......
  • odoo学习-2
    1.新加自定义模块odoo同级目录下新建my_addons文件夹加入自己的模块(注意:views中也要创建一个xml文件)  2.model代码-写在models下面的py文件中fromodooimportapi,fields,modelsclassEpidemicRecord(models.Model):_name='epidemic.record'#数据库......