netcore接入钉钉扫码登录

news2024/11/18 23:25:06

netcore接入钉钉扫码登录

  • 一、首先官方文档预览
  • 二、登录钉钉开发者后台
  • 三、创建第三方登录授权应用
    • 1.新版打开方式
    • 2.旧版打开方式
      • (1)先返回旧版页面
      • (2)选择应用开发
      • (3)编辑登录应用信息
      • (4)记录下appid和appSecret后续需要
  • 四、添加企业内部应用
    • 1.添加应用
    • 2.配置应用信息
    • 3.记录下appkey和appsecret
    • 4.添加回调地址
  • 五、添加接口调用权限
  • 六、添加内网穿透
  • 七、搭建项目
    • 1.代码下载
    • 2.SDK下载和配置
      • (1)sdk文档
      • (2)下载sdk
    • 3.修改博主的项目配置
  • 八、代码详解
    • 1.修改appsettings.json文件
    • 1.view修改
    • 2.代码演变以钉钉功能调试
    • 3.打开钉钉提供的api调试台
    • 4.根据对应的相应的信息获得demo代码直接复制到咱们的controller中
      • (1)先获取access_token
      • (2)通过扫码获得的code结合access_token获得用户unionid
      • (3)通过上一步sns码获得的unionid去获取userid
      • (4)通过上一步userid去获得用户的详细信息
  • 七、剩下功能大同小异,自己更具文档和下面给出的两个api调试控制台出不多都能搞定

一、首先官方文档预览

以下信息根据这个文档来进行讲解,其中进行了补充,使得文档更加易于理解(因为这方面netcore参考不多,我收集现在资料出一个较为详细的操作信息)
实现登录第三方网站文档

二、登录钉钉开发者后台

这里需要账号权限,需要公司给与开通相应得权限,这里默认为有权限。

钉钉开发者后台

三、创建第三方登录授权应用

1.新版打开方式

现在开发后台打开得都是默认新版页面,但是我没找到创建第三方登录授权应用按钮,所以接下来都是以旧版界面为例

在这里插入图片描述
选择移动应用接入
在这里插入图片描述

2.旧版打开方式

这里开始往下都是旧版模式界面

(1)先返回旧版页面

在这里插入图片描述

(2)选择应用开发

在这里插入图片描述

(3)编辑登录应用信息

在这里插入图片描述
回调域名是后端接口得具体地址

(4)记录下appid和appSecret后续需要

在这里插入图片描述

四、添加企业内部应用

这里特别注意

第三和这第四步创建的应用用途不一样
弟三步创建的应用,是用来登录的(我现在觉得理解为登录接口api合适点,应用有点抽象),这里的appkey和secrect是用来调取二维码用的
这第四步是用来创建真正的应用,你项目(第三方网站)所依赖的应用

1.添加应用

这里可以开发其他得应用,但这里不予以展示,自行摸索
在这里插入图片描述

2.配置应用信息

在这里插入图片描述

3.记录下appkey和appsecret

在这里插入图片描述

4.添加回调地址

在这里插入图片描述

五、添加接口调用权限

在这里插入图片描述

六、添加内网穿透

因为钉钉需要请求后端服务的接口,但在开发前期你需要测试,或者你处于公司内网,钉钉调取不到你的接口,所以需要进行内网穿透,来让钉钉服务能通过外网访问到你的主机。
点击这里查看我收集的两种内网穿透方法文章

七、搭建项目

1.代码下载

为了方便这里没有用前后分离,直接使用netcoremvc开发

在这里是使用的这位博主得代码,是在他得基础上进一步详细讲解和补充(controller修改了部分代码,适应新版sdk,view也就是前端页面只修改了几个配置,下面会指出,其他都是没有改动的)
代码下载

2.SDK下载和配置

(1)sdk文档

SDK文档地址

(2)下载sdk

新版sdk
新版sdk直接解压
旧版sdk(netcore版本,net版本还未尝试,自行摸索)
在这里插入图片描述
解压红框内的文件
在这里插入图片描述

3.修改博主的项目配置

直接打开是无法直接使用的需要引入sdk
在这里插入图片描述

右键项目解决方案-》添加-》项目引用,让后分别找到上面下载sdk的csproj添加上此时项目结构如上。

右键DingQrCodeLogin-》添加-》项目应用然后添加上这两个sdk的引用

八、代码详解

1.修改appsettings.json文件

==注意本文涉及了两个应用,一个是登录授权应用,一个是你自己的三方应用,这俩分别都有一对appid(key)和appsecret。不要设置混淆了,这是是设置为自己三方应用的。
在这里插入图片描述

1.view修改

view(界面)只需要修改如下地方
在这里插入图片描述
在这里插入图片描述

这里用户扫扫码后会给homecontroller传递code和state两个参数,state是固定的不用管

2.代码演变以钉钉功能调试

修改刚才下载下来的homecontroller代码

什么都没干,先定义方法接收,扫码后传递过来的参数

   public string DingLogin(string code, string state)
        {
        }

3.打开钉钉提供的api调试台

api调试台

在这里插入图片描述

4.根据对应的相应的信息获得demo代码直接复制到咱们的controller中

(1)先获取access_token

免密登录,需要access_token才行

   public static AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client CreateClient()
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
            config.Protocol = "https";
            config.RegionId = "central";
            return new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client(config);
        }
   public string DingLogin(string code, string state)
   {
   		    AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client client = CreateClient();
            AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest getAccessTokenRequest = new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest();
            try
            {
            // 这里获得了咱们的access_token
                client.GetAccessToken { AppKey = "自己的外部appkey",AppSecret = "自己。。。" };
            }
   }

(2)通过扫码获得的code结合access_token获得用户unionid

在这里插入图片描述

   public static AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client CreateClient()
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
            config.Protocol = "https";
            config.RegionId = "central";
            return new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client(config);
        }
   public string DingLogin(string code, string state)
   {
   		    AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client client = CreateClient();
            AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest getAccessTokenRequest = new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest();
            try
            {
            // 这里获得了咱们的access_token
                client.GetAccessToken { AppKey = "自己的外部appkey",AppSecret = "自己。。。" };
                
                //通过扫码获得的code和上面获取的access_token,获取unionid
                OapiSnsGetuserinfoBycodeResponse response = new OapiSnsGetuserinfoBycodeResponse();
                string qrAppId = AppConfigurtaionHelper.Configuration["DingDing:QrAppId"];
                string qrAppSecret = AppConfigurtaionHelper.Configuration["DingDing:QrAppSecret"];
                if (string.IsNullOrWhiteSpace(qrAppId) || string.IsNullOrWhiteSpace(qrAppSecret))
                {
                    throw new Exception("钉钉配置信息错误!");
                }

                DefaultDingTalkClient uclient = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
                OapiSnsGetuserinfoBycodeRequest ureq = new OapiSnsGetuserinfoBycodeRequest();
                ureq.TmpAuthCode = code;
                response = uclient.Execute(ureq, qrAppId, qrAppSecret);
            }
   }

(3)通过上一步sns码获得的unionid去获取userid

在这里插入图片描述

   public static AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client CreateClient()
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
            config.Protocol = "https";
            config.RegionId = "central";
            return new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client(config);
        }
   public string DingLogin(string code, string state)
   {
   		    AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client client = CreateClient();
            AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest getAccessTokenRequest = new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest();
            try
            {
            // 这里获得了咱们的access_token
                client.GetAccessToken { AppKey = "自己的外部appkey",AppSecret = "自己。。。" };
                
                //通过扫码获得的code和上面获取的access_token,获取unionid
                OapiSnsGetuserinfoBycodeResponse response = new OapiSnsGetuserinfoBycodeResponse();
                string qrAppId = AppConfigurtaionHelper.Configuration["DingDing:QrAppId"];
                string qrAppSecret = AppConfigurtaionHelper.Configuration["DingDing:QrAppSecret"];
                if (string.IsNullOrWhiteSpace(qrAppId) || string.IsNullOrWhiteSpace(qrAppSecret))
                {
                    throw new Exception("钉钉配置信息错误!");
                }

                DefaultDingTalkClient uclient = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
                OapiSnsGetuserinfoBycodeRequest ureq = new OapiSnsGetuserinfoBycodeRequest();
                ureq.TmpAuthCode = code;
                response = uclient.Execute(ureq, qrAppId, qrAppSecret);
                
                  //获取用户id
                IDingTalkClient ubclient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
                OapiUserGetbyunionidRequest ubreq = new OapiUserGetbyunionidRequest { Unionid = response.UserInfo.Unionid};
                OapiUserGetbyunionidResponse ubrsp = ubclient.Execute(ubreq, a.Body.AccessToken);
                Console.WriteLine(ubrsp.Body);
            }
   }

(4)通过上一步userid去获得用户的详细信息

在这里插入图片描述

   public static AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client CreateClient()
        {
            AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config();
            config.Protocol = "https";
            config.RegionId = "central";
            return new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client(config);
        }
   public string DingLogin(string code, string state)
   {
   		    AlibabaCloud.SDK.Dingtalkoauth2_1_0.Client client = CreateClient();
            AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest getAccessTokenRequest = new AlibabaCloud.SDK.Dingtalkoauth2_1_0.Models.GetAccessTokenRequest();
            try
            {
            // 这里获得了咱们的access_token
                client.GetAccessToken { AppKey = "自己的外部appkey",AppSecret = "自己。。。" };
                
                //通过扫码获得的code和上面获取的access_token,获取unionid
                OapiSnsGetuserinfoBycodeResponse response = new OapiSnsGetuserinfoBycodeResponse();
                string qrAppId = AppConfigurtaionHelper.Configuration["DingDing:QrAppId"];
                string qrAppSecret = AppConfigurtaionHelper.Configuration["DingDing:QrAppSecret"];
                if (string.IsNullOrWhiteSpace(qrAppId) || string.IsNullOrWhiteSpace(qrAppSecret))
                {
                    throw new Exception("钉钉配置信息错误!");
                }

                DefaultDingTalkClient uclient = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
                OapiSnsGetuserinfoBycodeRequest ureq = new OapiSnsGetuserinfoBycodeRequest();
                ureq.TmpAuthCode = code;
                response = uclient.Execute(ureq, qrAppId, qrAppSecret);
                
                  //获取用户id
                IDingTalkClient ubclient = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
                OapiUserGetbyunionidRequest ubreq = new OapiUserGetbyunionidRequest { Unionid = response.UserInfo.Unionid};
                OapiUserGetbyunionidResponse ubrsp = ubclient.Execute(ubreq, a.Body.AccessToken);
                Console.WriteLine(ubrsp.Body);
                
  //获取用户信息
                IDingTalkClient client2 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
                OapiV2UserGetRequest req2 = new OapiV2UserGetRequest { Userid = ubrsp.Result.Userid };
                OapiV2UserGetResponse rsp2 = client2.Execute(req2, a.Body.AccessToken);
            }
   }

剩下的就需要直接自己去根据需求进行探索

七、剩下功能大同小异,自己更具文档和下面给出的两个api调试控制台出不多都能搞定

功能api

功能api

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm包是什么?如何发布npm包?

Node的组成 内置模块 自定义模块 第三方模块(什么是包?) npm包包括那些东西? package.json README.md 。。。.js 注册npm账号 细节 发布包 package.json README.md index.js date htmlEscape 层级结构 发布指令 N…

STC15 - C51 - Memory Models

文章目录STC15 - C51 - Memory Models概述笔记内存用量的优化思路ENDSTC15 - C51 - Memory Models 概述 在STC上测试呢, 想看看变量(不同类型的定义)被编译器分配在哪个内存范围(idata, pdata, xdata)? 同时, 总结一下降低内存用量的思路(如果像上位机那样内存管够, 就不用考…

Linux系统编程第五节——进程创建、终止、等待(通俗易懂快速上手版本)

目录 进程的创建 写时拷贝 进程的终止 进程的等待 状态参数status wait函数和waitpid函数 我们本节内容,主要来讲述进程控制有关的内容。 同样,我们会用通俗易懂、不同于教科书的讲授思路,来为大家讲解。 同时,本节内容板块…

你了解你的身体吗?- 基因社会

关于作者 本书的两位作者分别是以太•亚奈和马丁 • 菜凯尔,前者是哈佛大学髙级研究学者, 任职于纽约大学,是生物化学和分子药理 学的教授;后者是杜塞尔多夫海因西里•海 涅大学的生物信息学教授。两位作者从基 因之间合作和竞争…

[附源码]计算机毕业设计的4s店车辆管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

5款十分好用,但是没有什么知名度的软件

随着网络信息技术的发展,越来越多的人在办公时需要用到电脑了。如果你想提高办公效率,那么就少不了工具的帮忙,今天给大家分享5款办公必备的好软件。 1.数据可视化软件——Power BI Power BI是一款出色的业务分析软件。Power BI主要是用于在…

[Go] go基础4

1. 并发编程 1.1 并发和并行 并发: 多个线程在同个核心的CPU上运行.并发的本质是串行. 并行: 多个线程在多个核心的CPU上运行. 1.2 协程和线程 协程: 独立的栈空间,共享堆空间,调度由用户控制,本质上有点类似用户及线程,这些用户及线程的调度也是自己实现的. 线程: 一个线…

[附源码]JAVA毕业设计网络饮品销售管理系统(系统+LW)

[附源码]JAVA毕业设计网络饮品销售管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目…

全新社交电商模式来袭,消费增值结合共享经济完成消费升级

大家好,我是林工,不知道大家是否了解消费增值?这是一个消费储量为基础的理念,体现的是消费者的消费与回报问题,普遍的消费返利,消费全返渐渐地已经不能够满足目前的客户,也就有了一个满足与这部…

【嵌入式硬件芯片开发笔记】4-20mA DAC芯片AD5421配置流程

【嵌入式硬件芯片开发笔记】4-20mA DAC芯片AD5421配置流程 16位、串行输入、环路供电、4 mA至20 mA DAC 可用于HART协议相关电路 同AD5700配合使用 AD5421的SPI和普通的不一样 回读时要发两段 CS中间拉高一次 数据在SCLK上升沿逐个输出,而且在 SCLK下降沿有效 固CP…

使用方法丨艾美捷Caspase-1活性分析试剂盒介绍

如何动态检测活细胞内的Caspase-1的活性,做更真实的实验?艾美捷推荐Immunochemistry Tech(ICT)的FLICA系列科研工具,轻松检测活细胞Caspase-1 活性。 艾美捷Immunochemistry Caspase-1活性分析试剂盒原理&#xff1a…

Qt第三十四章:总结【隐藏标题栏边框、隐藏背景、窗体透明】

目录 隐藏标题栏边框 ①隐藏标题栏代码: ​编辑②自定义标题栏(可以直接Copy) 使用 隐藏背景 ①隐藏背景代码,此时背景上的样式都是无效的。 ②自定义背景,通过重写paintEvent事件来完成 中间绘制的部分是我们想要的,只需要将标题栏边框隐藏掉就可…

五、卷积神经网络CNN5(图像卷积与反卷积)

图像卷积 首先给出一个输入输出结果那他是怎样计算的呢? 卷积的时候需要对卷积核进行 180 的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下:这样计算出左上角(即第…

【畅购商城】内网穿透之EchoSite

目录 概述 注册用户 抢注域名 ​​​​​​​下载客户端 ​​​​​​​编写配置文件 ​​​​​​​启动 ​​​​​​​访问 ​​​​​​​概述 EchoSite一款收费的内网映射工具(已下架) 花生壳:内网穿透工具,免费版…

springboot集成Lombok、MybaitsPlus、SwaggerUI

springboot集成Lombok、MybaitsPlus、SwaggerUI 基础环境&#xff1a;JDK8或者JDK11版本 Maven3.5(采⽤默认) IDEA旗舰版 Mysql5.7以上版本 创建springboot项目 在线构建⼯具 https://start.spring.io/ 修改pom.xml中内容 <!-- 代码库 --> <repositories> &l…

如何提高量化策略回测的效率

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

教你轻松设计圣诞节日活动的邀请函?

即将迎来一年一度的圣诞活动&#xff0c;商家们要如何对此次活动展开宣传呢&#xff1f;要如何制作出一张符合节日气氛的活动邀请函&#xff1f;下面小编就教你如何使用在线工具乔拓云&#xff0c;用在线邀请函模板设计活动邀请函&#xff0c;一键就能生成活动邀请函链接&#…

springmvc整体运行流程

请求处理的流程 1&#xff1a;浏览器发送请求送至前端控制器DispatcherServlet。 2&#xff1a;DispatcherServlet收到请求后调用HandlerMapping处理器映射器。 3&#xff1a;处理器映射器找到具体的Handler处理器&#xff0c;封装成为执行链 4&#xff1a;返回执行链给Disp…

SpringBoot+MyBatis多表查询:以点餐系统的订单管理为例

文章目录项目场景数据库设计POJODaoServiceTest运行结果问题及解决项目场景 SpringBoot MyBatis &#xff0c;实现点餐系统的订单查询。 参考&#xff1a;SpringBootMyBatis多表联合查询 数据库设计 通常一个订单中会包含多个菜品&#xff0c;即一条 order 里含多个 item&am…

使用 Zotero Citation Counts Manager 自动获取文献引用数

前言 最近习惯了搜完文献把文献的引用贴进 Zotero 文献条目的 Note 里&#xff0c;但是自己一点一点打字太累。想到了 Zotero 有插件&#xff0c;简单调研一下&#xff0c;发现了一个可以用的插件。支持 CrossRef 和 SemanticScholar 的引用数获取。&#xff08;相对来说个人比…