釘釘作為阿里旗下的一款免費移動通訊軟件,受眾群體越來越多,這里我們使用Django來集成一下釘釘的三方賬號登錄,首先注冊釘釘開發平台:https://open-dev.dingtalk.com/
在移動應用中選擇登錄
創建一個網站應用,其中有用的信息是 appid , appsecret ,還有回調網址
隨后,查看官方文檔,查看如何構造登錄url:https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6
這里我們用django視圖來操作
#構造釘釘登錄url
def ding_url(request):
appid = 'dingoaukgkwqknzjvamdqh'
redirect_uri = 'http://localhost:8000/dingding_back/'
return redirect('https://oapi.dingtalk.com/connect/qrconnect?appid='+appid+'&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+redirect_uri)
然后訪問 http://localhost:8000/ding_url , 就可以進行掃碼
隨后,釘釘會將code返回到回調網址中,查看官方文檔,只有 java 和 php 的 sdk,並沒有python的
SDK請求示例(JAVA):
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
req.setTmpAuthCode("4a2c5695b78738d495f47b5fee9160cd");
OapiSnsGetuserinfoBycodeResponse response = client.execute(req,"yourAppId","yourAppSecret");
SDK請求示例(PHP):
include "TopSdk.php";
$c = new DingTalkClient(DingTalkConstant::$CALL_TYPE_OAPI, DingTalkConstant::$METHOD_POST , DingTalkConstant::$FORMAT_JSON);
$req = new OapiSnsGetuserinfoBycodeRequest;
$req->setTmpAuthCode("4a2c5695b78738d495f47b5fee9160cd");
$resp=$c->executeWithAccessKey($req, "https://oapi.dingtalk.com/sns/getuserinfo_bycode","yourAppId","yourAppSecret");
var_dump($resp)
python 邏輯很簡單,將時間戳,秘鑰進行hmac加密即可
# 構造釘釘回調方法
# 導包:
import hmac
import base64
from hashlib import sha256
import urllib
import json
def ding_url(request):
appid = 'dingoadckiwhdceemaxrza',
redirect_uri = 'http://127.0.0.1:8000/ding_url'
# 獲取code
code = request.GET.get("code")
t = time.time()
# 時間戳
timestamp = str((int(round(t * 1000))))
# 密鑰
appSecret = 'Uym9ecJfNF4vlQ9-8wAGl2J10GvyZNKJqiXvcuf0blp7ERTpWrif8IwWk_AGI1j-'
# 構造簽名
signature = base64.b64encode(
hmac.new(appSecret.encode('utf-8'), timestamp.encode('utf-8'), digestmod=sha256).digest())
# 請求接口,換取釘釘用戶名
payload = {'tmp_auth_code': code}
headers = {'Content-Type': 'application/json'}
# parse(alt+回車 第二個 導包)
res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature=' + urllib.parse.quote(
signature.decode("utf-8")) + "×tamp=" + timestamp + "&accessKey=dingoadckiwhdceemaxrza",
data=json.dumps(payload), headers=headers)
res_dict = json.loads(res.text)
print(res_dict)
訪問一下,可以顯示出釘釘的用戶名
vue與django結合 釘釘第三放登錄
//vue登錄頁面內點擊事件
//釘釘登錄
dingding() {
//拼接釘釘url
let url = "https://oapi.dingtalk.com/connect/qrconnect?appid=dingoadckiwhdceemaxrza&response_type=code&scope=snsapi_login&state=STATE&redirect_uri=http://127.0.0.1:8000/ding_url"
//進行站外跳轉
window.location.href = url;
},
django視圖頁面:
# 導包:
import hmac
import base64
from hashlib import sha256
import urllib
import json
def ding_url(request):
appid = 'dingoadckiwhdceemaxrza',
redirect_uri = 'http://127.0.0.1:8000/ding_url'
# 'https: // oapi.dingtalk.com / connect / qrconnect?appid =dingoamo0tezhk5hsckrrk & response_type = code & scope = snsapi_login & state = STATE & redirect_uri =http://localhost:8000/dingding_back/'
# 獲取code
code = request.GET.get("code")
t = time.time()
# 時間戳
timestamp = str((int(round(t * 1000))))
appSecret = 'Uym9ecJfNF4vlQ9-8wAGl2J10GvyZNKJqiXvcuf0blp7ERTpWrif8IwWk_AGI1j-'
# 構造簽名
signature = base64.b64encode(
hmac.new(appSecret.encode('utf-8'), timestamp.encode('utf-8'), digestmod=sha256).digest())
# 請求接口,換取釘釘用戶名
payload = {'tmp_auth_code': code}
headers = {'Content-Type': 'application/json'}
# parse(alt+回車 第二個 導包)
res = requests.post('https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature=' + urllib.parse.quote(
signature.decode("utf-8")) + "×tamp=" + timestamp + "&accessKey=dingoadckiwhdceemaxrza",
data=json.dumps(payload), headers=headers)
res_dict = json.loads(res.text)
#判斷是否為第一次登錄
user = models.User.objects.filter(username=str(res_dict['user_info']['nick'])).first()
sina_name = ''
user_id = ''
# 代表曾經登陸
if user:
sina_name = user.username
user_id = user.id
else:
# 首次登錄 建立賬號保存到數據庫
models.User(username=str(res_dict['user_info']['nick']), password=make_password(''), type=0).save()
print('已創建釘釘賬戶')
# 查詢用戶
user = models.User.objects.filter(username=str(res_dict['user_info']['nick'])).first()
sina_name = res_dict['user_info']['nick']
user_id = user.id
# 進行跳轉
return redirect("http://localhost:8080?sina_name=" + str(sina_name) + "&uid=" + str(user_id))