mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-12 04:39:02 +00:00
feat: 支持钉钉、飞书、企业微信扫码登录无用户时自动创建用户
This commit is contained in:
committed by
Jiangjie.Bai
parent
7ff22cbc34
commit
bda748d547
@@ -5,6 +5,7 @@ import base64
|
||||
from common.utils import get_logger
|
||||
from common.sdk.im.utils import digest, as_request
|
||||
from common.sdk.im.mixin import BaseRequest
|
||||
from users.utils import construct_user_email
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
@@ -35,6 +36,7 @@ class URL:
|
||||
SEND_MESSAGE = 'https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2'
|
||||
GET_SEND_MSG_PROGRESS = 'https://oapi.dingtalk.com/topapi/message/corpconversation/getsendprogress'
|
||||
GET_USERID_BY_UNIONID = 'https://oapi.dingtalk.com/topapi/user/getbyunionid'
|
||||
GET_USER_INFO_BY_USER_ID = 'https://oapi.dingtalk.com/topapi/v2/user/get'
|
||||
|
||||
|
||||
class DingTalkRequests(BaseRequest):
|
||||
@@ -129,11 +131,11 @@ class DingTalk:
|
||||
data = self._request.post(URL.GET_USER_INFO_BY_CODE, json=body, with_sign=True)
|
||||
return data['user_info']
|
||||
|
||||
def get_userid_by_code(self, code):
|
||||
def get_user_id_by_code(self, code):
|
||||
user_info = self.get_userinfo_bycode(code)
|
||||
unionid = user_info['unionid']
|
||||
userid = self.get_userid_by_unionid(unionid)
|
||||
return userid
|
||||
return userid, None
|
||||
|
||||
def get_userid_by_unionid(self, unionid):
|
||||
body = {
|
||||
@@ -195,3 +197,18 @@ class DingTalk:
|
||||
|
||||
data = self._request.post(URL.GET_SEND_MSG_PROGRESS, json=body, with_token=True)
|
||||
return data
|
||||
|
||||
def get_user_detail(self, user_id, **kwargs):
|
||||
# https://open.dingtalk.com/document/orgapp/query-user-details
|
||||
body = {'userid': user_id}
|
||||
data = self._request.post(
|
||||
URL.GET_USER_INFO_BY_USER_ID, json=body, with_token=True
|
||||
)
|
||||
data = data['result']
|
||||
username = user_id
|
||||
name = data.get('name', username)
|
||||
email = data.get('email') or data.get('org_email')
|
||||
email = construct_user_email(username, email)
|
||||
return {
|
||||
'username': username, 'name': name, 'email': email
|
||||
}
|
||||
|
@@ -1,9 +1,9 @@
|
||||
import json
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from rest_framework.exceptions import APIException
|
||||
|
||||
from django.conf import settings
|
||||
from users.utils import construct_user_email
|
||||
from common.utils.common import get_logger
|
||||
from common.sdk.im.utils import digest
|
||||
from common.sdk.im.mixin import RequestMixin, BaseRequest
|
||||
@@ -30,13 +30,16 @@ class URL:
|
||||
return f'{self.host}/open-apis/auth/v3/tenant_access_token/internal/'
|
||||
|
||||
@property
|
||||
def get_user_info_by_code(self):
|
||||
def get_userinfo_by_code(self):
|
||||
return f'{self.host}/open-apis/authen/v1/access_token'
|
||||
|
||||
@property
|
||||
def send_message(self):
|
||||
return f'{self.host}/open-apis/im/v1/messages'
|
||||
|
||||
def get_user_detail(self, user_id):
|
||||
return f'{self.host}/open-apis/contact/v3/users/{user_id}'
|
||||
|
||||
|
||||
class ErrorCode:
|
||||
INVALID_APP_ACCESS_TOKEN = 99991664
|
||||
@@ -103,10 +106,10 @@ class FeiShu(RequestMixin):
|
||||
'code': code
|
||||
}
|
||||
|
||||
data = self._requests.post(URL().get_user_info_by_code, json=body, check_errcode_is_0=False)
|
||||
data = self._requests.post(URL().get_userinfo_by_code, json=body, check_errcode_is_0=False)
|
||||
|
||||
self._requests.check_errcode_is_0(data)
|
||||
return data['data']['user_id']
|
||||
return data['data']['user_id'], data['data']
|
||||
|
||||
def send_text(self, user_ids, msg):
|
||||
params = {
|
||||
@@ -130,3 +133,15 @@ class FeiShu(RequestMixin):
|
||||
logger.exception(e)
|
||||
invalid_users.append(user_id)
|
||||
return invalid_users
|
||||
|
||||
@staticmethod
|
||||
def get_user_detail(user_id, **kwargs):
|
||||
# get_user_id_by_code 已经返回个人信息,这里直接解析
|
||||
data = kwargs['other_info']
|
||||
username = user_id
|
||||
name = data.get('name', username)
|
||||
email = data.get('email') or data.get('enterprise_email')
|
||||
email = construct_user_email(username, email)
|
||||
return {
|
||||
'username': username, 'name': name, 'email': email
|
||||
}
|
||||
|
@@ -3,8 +3,9 @@ from typing import Iterable, AnyStr
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from rest_framework.exceptions import APIException
|
||||
|
||||
from users.utils import construct_user_email
|
||||
from common.utils.common import get_logger
|
||||
from common.sdk.im.utils import digest, DictWrapper, update_values, set_default
|
||||
from common.sdk.im.utils import digest, update_values
|
||||
from common.sdk.im.mixin import RequestMixin, BaseRequest
|
||||
|
||||
logger = get_logger(__name__)
|
||||
@@ -151,10 +152,7 @@ class WeCom(RequestMixin):
|
||||
|
||||
def get_user_id_by_code(self, code):
|
||||
# # https://open.work.weixin.qq.com/api/doc/90000/90135/91437
|
||||
|
||||
params = {
|
||||
'code': code,
|
||||
}
|
||||
params = {'code': code}
|
||||
data = self._requests.get(URL.GET_USER_ID_BY_CODE, params=params, check_errcode_is_0=False)
|
||||
|
||||
errcode = data['errcode']
|
||||
@@ -175,12 +173,15 @@ class WeCom(RequestMixin):
|
||||
logger.error(f'WeCom response 200 but get field from json error: fields=UserId|OpenId')
|
||||
raise WeComError
|
||||
|
||||
def get_user_detail(self, id):
|
||||
def get_user_detail(self, user_id, **kwargs):
|
||||
# https://open.work.weixin.qq.com/api/doc/90000/90135/90196
|
||||
|
||||
params = {
|
||||
'userid': id,
|
||||
params = {'userid': user_id}
|
||||
data = self._requests.get(URL.GET_USER_DETAIL, params)
|
||||
username = data.get('userid')
|
||||
name = data.get('name', username)
|
||||
email = data.get('email') or data.get('biz_mail')
|
||||
email = construct_user_email(username, email)
|
||||
return {
|
||||
'username': username, 'name': name, 'email': email
|
||||
}
|
||||
|
||||
data = self._requests.get(URL.GET_USER_DETAIL, params)
|
||||
return data
|
||||
|
Reference in New Issue
Block a user