前言
我相信很多同学都对接过各种各样的第三方平台的登录授权获取用户信息(如:微信登录、支付宝登录、GitHub登录等等)。今天给大家推荐一个.NET开源最全的第三方登录整合库:CollectiveOAuth。
官方项目介绍
.Net平台(C#) 史上最全的整合第三方登录的开源库 => 环境支持 .NET Framework 4.5 ~ 4.6.2 和 .NetCore 3.1。目前已包含Github、Gitee、钉钉、百度、支付宝、微信、企业微信、腾讯云开发者平台(Coding)、OSChina、微博、QQ、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、酷家乐、Gitlab、美团、饿了么、等第三方平台的授权登录。
项目特点
- 全:已集成二十多家第三方平台(国内外常用的基本都已包含),仍然还在持续扩展中!
- 简:API就是奔着最简单去设计的(见后面快速开始),尽量让您用起来没有障碍感!
企业微信扫码授权快速开始
0、企业微信开发对接文档
文档介绍
企业微信扫码授权登录官方文档地址:https://developer.work.weixin.qq.com/document/path/91025,在进行企业微信扫码授权绑定/登录之前需要先自建应用,同时需要开启网页授权登录,具体自建应用的相关操作可以参考博文:https://developer.aliyun.com/article/1136114
管理平台接入
完成了上面企业微信管理后台的相关配置之后,我们就可以按照文档步骤开始操作了
构造二维码
关于构造企业微信扫码绑定/登录二维码一共有两种方式:构造独立窗口登录二维码、构造内嵌登录二维码,下面简单说一下构造独立窗口登录二维码
构造独立窗口登录二维码
构造独立窗口登录二维码,可以在页面放置一个 button 按钮,添加点击事件,在触发点击事件时访问连接https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=CORPID&agentid=AGENTID&redirect_uri=REDIRECT_URI&state=STATE,效果如图:
连接参数说明:
1、引入依赖
下载源码,添加Come.CollectiveOAuth类库。
2、配置企业微信扫码授权(appsettings.json)中配置
{
"AppSettings":{
//企业微信扫码授权
"CollectiveOAuth_WECHAT_ENTERPRISE_SCAN_ClientId":"xxxxxxxxxxxxxxxxx",
"CollectiveOAuth_WECHAT_ENTERPRISE_SCAN_AgentId":"xxxxxx",
"CollectiveOAuth_WECHAT_ENTERPRISE_SCAN_ClientSecret":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"CollectiveOAuth_WECHAT_ENTERPRISE_SCAN_RedirectUri":"https://yours.domain.com/oauth2/callback?authSource=WECHAT_ENTERPRISE_SCAN"
},
"Logging":{
"LogLevel":{
"Default":"Information",
"Microsoft":"Warning",
"Microsoft.Hosting.Lifetime":"Information"
}
},
"AllowedHosts":"*"
}
构建授权Url方法
///
///构建授权Url方法
///
///
///RedirectUrl
publicIActionResultAuthorization(stringauthSource="WECHAT_ENTERPRISE_SCAN")
{
AuthRequestFactoryauthRequest=newAuthRequestFactory();
varrequest=authRequest.getRequest(authSource);
varauthorize=request.authorize(AuthStateUtils.createState());
Console.WriteLine(authorize);
returnRedirect(authorize);
}
publicclassAuthRequestFactory
{
#region从Webconfig中获取默认配置(可以改造成从数据库中读取)
publicDictionary_clientConfigs;
publicDictionaryClientConfigs
{
get
{
if(_clientConfigs==null)
{
var_defaultPrefix="CollectiveOAuth_";
_clientConfigs=newDictionary();
#region或者默认授权列表数据
vardefaultAuthList=typeof(DefaultAuthSourceEnum).ToList().Select(a=&服务器托管网gt;a.Name.ToUpper()).ToList();
foreach(varauthSourceindefaultAuthList)
{
varclientConfig=newClientConfig();
clientConfig.clientId=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_ClientId");
clientConfig.clientSecret=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_ClientSecret");
clientConfig.redirectUri=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_RedirectUri");
clientConfig.alipayPublicKey=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_AlipayPublicKey");
clientConfig.unionId=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_UnionId");
clientConfig.stackOverflowKey=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_StackOverflowKey");
clientConfig.agentId=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_AgentId");
clientConfig.scope=AppSettingUtils.GetStrValue($"{_defaultPrefix}{authSource}_Scope");
_clientConfigs.Add(authSource,clientConfig);
}
#endregion
}
return_clientConfigs;
}
}
publicClientConfigGetClientConfig(stringauthSource)
{
if(authSource.IsNullOrWhiteSpace())
{
returnnull;
}
if(!ClientConfigs.ContainsKey(authSource))
{
returnnull;
}
else
{
returnClientConfigs[authSource];
}
}
#endregion
/**
*返回AuthRequest对象
*
*@return{@linkAuthRequest}
*/
publicIAuthRequestgetRequest(stringauthSource)
{
//获取CollectiveOAuth中已存在的
IAuthRequestauthRequest=getDefaultRequest(authSource);
returnauthRequest;
}
///
///获取默认的Request
///
///
///{@linkAuthRequest}
privateIAuthRequestgetDefaultRequest(stringauthSource)
{
ClientConfigclientConfig=GetClientConfig(authSource);
IAuthStateCacheauthStateCache=newDefaultAuthStateCache();
DefaultAuthSourceEnumauthSourceEnum=GlobalAuthUtil.enumFromString(authSource);
switch(authSourceEnum)
{
caseDefaultAuthSourceEnum.WECHAT_MP:
returnnewWeChatMpAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.WECHAT_OPEN:
returnnewWeChatOpenAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.WECHAT_ENTERPRISE:
returnnewWeChatEnterpriseAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.WECHAT_ENTERPRISE_SCAN:
returnnewWeChatEnterpriseScanAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.ALIPAY_MP:
returnnewAlipayMpAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.GITEE:
returnnewGiteeAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.GITHUB:
returnnewGithubAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.BAIDU:
returnnewBaiduAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.XIAOMI:
returnnewXiaoMiAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.DINGTALK_SCAN:
returnnewDingTalkScanAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.OSCHINA:
returnnewOschinaAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.CODING:
returnnewCodingAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.LINKEDIN:
returnnewLinkedInAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.WEIBO:
returnnewWeiboAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.QQ:
returnnewQQAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.DOUYIN:
returnnewDouyinAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.GOOGLE:
returnnewGoogleAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.FACEBOOK:
returnnewFackbookAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.MICROSOFT:
returnnewMicrosoftAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.TOUTIAO:
returnnewToutiaoAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.TEAMBITION:
returnnewTeambitionAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.RENREN:
returnnewRenrenAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.PINTEREST:
returnnewPinterestAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.STACK_OVERFLOW:
returnnewStackOverflowAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.HUAWEI:
returnnewHuaweiAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.KUJIALE:
returnnewKujialeAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.GITLAB:
returnnewGitlabAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.MEITUAN:
returnnewMeituanAuthRequest(clientConfig,authStateCache);
caseDefaultAuthSourceEnum.ELEME:
returnnewElemeAuthRequest(clientConfig,authStateCache);
default:
returnnull;
}
}
}
API列表
https://gitee.com/rthinking/CollectiveOAuth#api%E5%88%97%E8%A1%A8
项目源码地址
更多实用功能特性欢迎前往开源地址查看,别忘了给项目一个Star。
https://gitee.com/rthinking/CollectiveOAuth
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发效率和质量。坑已挖,欢迎大家踊跃提交PR,自荐(让优秀的项目和框架不被埋没
)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
加入DotNetGuide技术交流群
- 提供.NET开发者分享自己优质文章的群组和获取更多全服务器托管网面的C#/.NET/.NET Core学习资料、视频、文章、书籍,社区组织,工具和常见面试题资源,帮助大家更好地了解和使用 .NET技术。
- 在这个群里,开发者们可以分享自己的项目经验、遇到的问题以及解决方案,倾听他人的意见和建议,共同成长与进步。
- 可以结识更多志同道合的开发者,甚至可能与其他开发者合作完成有趣的项目。通过这个群组,我们希望能够搭建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值。
欢迎加入DotNetGuide技术交流群
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net