欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*

程序员文章站 2022-12-09 15:48:53
Netnr.Login 第三方OAuth授权登录 支持第三方登录 三方参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 参考文档 安装 (NuGet) 修改配置信息(密钥、回调等) 提醒:一般所有第三方登录都有一个 state 参数,用于防 ......

netnr.login

第三方oauth授权登录

支持第三方登录

三方 参考文档
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、* 参考文档
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、* 参考文档
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、* 参考文档
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*
第三方OAuth授权登录,QQ、微信(WeChat)、微博、GitHub、码云(Gitee)、淘宝(天猫)、微软(Microsoft )、钉钉、谷歌(Google)、支付宝(AliPay)、*

安装 (nuget)

install-package netnr.login

修改配置信息(密钥、回调等)

提醒:一般所有第三方登录都有一个 state 参数,用于防止csrf攻击(防伪),可以利用该参数添加 登录、注册 的标注前缀

框架

  • .netstandard 2.1
  • .netframework 4.0

使用

/*
 * 这是测试代码,只为调通每一个接口,拿到 唯一标识
 * 实际应用中还要处理昵称、邮箱、头像等,可参考个站开源项目:https://github.com/netnr/blog
 */

using system;

namespace netnr.login.sample
{
    class program
    {
        static void main(string[] args)
        {
            var lc = new loginclient(loginbase.logintype.*);

            //拷贝授权链接在浏览器打开,授权后拿到code,并手动赋值,手动赋值需解码
            var url = lc.auth();

            var ar = new loginbase.authorizeresult();
            ar.code = "";
            //此处打断点,赋值上面拿到的code再继续
            ar.code = ar.code.todecode();

            lc.authcallback(ar);
        }

        public class loginclient
        {
            private loginbase.logintype? logintype;

            public loginclient(loginbase.logintype _logintype)
            {
                logintype = _logintype;

                // 配置
                qqconfig.appid = "xxx";
                qqconfig.appkey = "xxx";
                //回调地址,与申请填写的地址保持一致
                qqconfig.redirect_uri = "https://rf2.netnr.com/account/authcallback/qq";

                wechatconfig.appid = "";
                wechatconfig.appsecret = "";
                wechatconfig.redirect_uri = "";

                weiboconfig.appkey = "";
                weiboconfig.appsecret = "";
                weiboconfig.redirect_uri = "";

                githubconfig.clientid = "";
                githubconfig.clientsecret = "";
                githubconfig.redirect_uri = "";
                //申请的应用名称,非常重要
                githubconfig.applicationname = "netnrf";

                taobaoconfig.appkey = "";
                taobaoconfig.appsecret = "";
                taobaoconfig.redirect_uri = "";

                microsoftconfig.clientid = "";
                microsoftconfig.clientsecret = "";
                microsoftconfig.redirect_uri = "";

                dingtalkconfig.appid = "";
                dingtalkconfig.appsecret = "";
                dingtalkconfig.redirect_uri = "";

                giteeconfig.clientid = "";
                giteeconfig.clientsecret = "";
                giteeconfig.redirect_uri = "";

                googleconfig.clientid = "";
                googleconfig.clientsecret = "";
                googleconfig.redirect_uri = "";

                alipayconfig.appid = "";
                alipayconfig.appprivatekey = "";
                alipayconfig.redirect_uri = "";

                *config.clientid = "";
                *config.clientsecret = "";
                *config.key = "";
                *config.redirect_uri = "";
            }

            /// <summary>
            /// 生成请求链接
            /// </summary>
            /// <param name="authtype">在防伪参数追加信息(可用于登录、注册、绑定、解绑区分)</param>
            /// <returns></returns>
            public string auth(string authtype = "")
            {
                var url = string.empty;

                switch (logintype)
                {
                    case loginbase.logintype.qq:
                        {
                            var reqe = new qq_authorization_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = qq.authorizationhref(reqe);
                        }
                        break;
                    case loginbase.logintype.weibo:
                        {
                            var reqe = new weibo_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = weibo.authorizehref(reqe);
                        }
                        break;
                    case loginbase.logintype.github:
                        {
                            var reqe = new github_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = github.authorizehref(reqe);
                        }
                        break;
                    case loginbase.logintype.taobao:
                        {
                            var reqe = new taobao_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = taobao.authorizehref(reqe);
                        }
                        break;
                    case loginbase.logintype.microsoft:
                        {
                            var reqe = new microsoft_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = microsoft.authorizehref(reqe);
                        }
                        break;
                    case loginbase.logintype.wechat:
                        {
                            var reqe = new wechat_authorization_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = wechat.authorizationhref(reqe);
                        }
                        break;
                    case loginbase.logintype.dingtalk:
                        {
                            var reqe = new dingtalk_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            //扫描模式
                            url = dingtalk.authorizehref_scancode(reqe);

                            //密码模式
                            //url = dingtalk.authorizehref_password(reqe);
                        }
                        break;
                    case loginbase.logintype.gitee:
                        {
                            var reqe = new gitee_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = gitee.authorizehref(reqe);
                        }
                        break;
                    case loginbase.logintype.google:
                        {
                            var reqe = new google_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = google.authorizehref(reqe);
                        }
                        break;
                    case loginbase.logintype.alipay:
                        {
                            var reqe = new alipay_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = alipay.authorizehref(reqe);
                        }
                        break;
                    case loginbase.logintype.*:
                        {
                            var reqe = new *_authorize_requestentity();
                            if (!string.isnullorwhitespace(authtype))
                            {
                                reqe.state = authtype + reqe.state;
                            }
                            url = *.authorizehref(reqe);
                        }
                        break;
                }

                return url;
            }

            /// <summary>
            /// 回调方法
            /// </summary>
            /// <param name="authorizeresult">接收授权码、防伪参数</param>
            public void authcallback(loginbase.authorizeresult authorizeresult)
            {
                if (string.isnullorwhitespace(authorizeresult.code))
                {
                    //打开链接没登录授权
                }
                else
                {
                    //唯一标示
                    string openid = string.empty;

                    switch (logintype)
                    {
                        case loginbase.logintype.qq:
                            {
                                //获取 access_token
                                var tokenentity = qq.accesstoken(new qq_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 opendid
                                var openidentity = qq.openid(new qq_openid_requestentity()
                                {
                                    access_token = tokenentity.access_token
                                });

                                //获取 userinfo
                                _ = qq.openid_get_user_info(new qq_openapi_requestentity()
                                {
                                    access_token = tokenentity.access_token,
                                    openid = openidentity.openid
                                });

                                //身份唯一标识
                                openid = openidentity.openid;
                            }
                            break;
                        case loginbase.logintype.weibo:
                            {
                                //获取 access_token
                                var tokenentity = weibo.accesstoken(new weibo_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 access_token 的授权信息
                                var tokeninfoentity = weibo.gettokeninfo(new weibo_gettokeninfo_requestentity()
                                {
                                    access_token = tokenentity.access_token
                                });

                                //获取 users/show
                                _ = weibo.usershow(new weibo_usershow_requestentity()
                                {
                                    access_token = tokenentity.access_token,
                                    uid = convert.toint64(tokeninfoentity.uid)
                                });

                                openid = tokenentity.access_token;
                            }
                            break;
                        case loginbase.logintype.wechat:
                            {
                                //获取 access_token
                                var tokenentity = wechat.accesstoken(new wechat_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 user
                                _ = wechat.get_user_info(new wechat_openapi_requestentity()
                                {
                                    access_token = tokenentity.access_token,
                                    openid = tokenentity.openid
                                });

                                //身份唯一标识
                                openid = tokenentity.openid;
                            }
                            break;
                        case loginbase.logintype.github:
                            {
                                //获取 access_token
                                var tokenentity = github.accesstoken(new github_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 user
                                var userentity = github.user(new github_user_requestentity()
                                {
                                    access_token = tokenentity.access_token
                                });

                                openid = userentity.id.tostring();
                            }
                            break;
                        case loginbase.logintype.taobao:
                            {
                                //获取 access_token
                                var tokenentity = taobao.accesstoken(new taobao_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                openid = tokenentity.open_uid;
                            }
                            break;
                        case loginbase.logintype.microsoft:
                            {
                                //获取 access_token
                                var tokenentity = microsoft.accesstoken(new microsoft_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 user
                                var userentity = microsoft.user(new microsoft_user_requestentity()
                                {
                                    access_token = tokenentity.access_token
                                });

                                openid = userentity.id.tostring();
                            }
                            break;
                        case loginbase.logintype.dingtalk:
                            {
                                //获取 user
                                var userentity = dingtalk.user(new dingtalk_user_requestentity(), authorizeresult.code);

                                openid = userentity?.openid;
                            }
                            break;
                        case loginbase.logintype.gitee:
                            {
                                //获取 access_token
                                var tokenentity = gitee.accesstoken(new gitee_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 user
                                var userentity = gitee.user(new gitee_user_requestentity()
                                {
                                    access_token = tokenentity.access_token
                                });

                                openid = userentity.id.tostring();
                            }
                            break;
                        case loginbase.logintype.google:
                            {
                                //获取 access_token
                                var tokenentity = google.accesstoken(new google_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 user
                                var userentity = google.user(new google_user_requestentity()
                                {
                                    access_token = tokenentity.access_token
                                });

                                openid = userentity.sub;
                            }
                            break;
                        case loginbase.logintype.alipay:
                            {
                                //获取 access_token
                                var tokenentity = alipay.accesstoken(new alipay_accesstoken_requestentity()
                                {
                                    code = authorizeresult.auth_code
                                });

                                //实际上这一步已经获取到 openid,登录验证可以了,获取个人信息还需调用下面的接口
                                //tokenentity.user_id

                                //获取 user
                                var userentity = alipay.user(new alipay_user_requestentity()
                                {
                                    auth_token = tokenentity.access_token
                                });

                                openid = userentity.user_id;
                            }
                            break;
                        case loginbase.logintype.*:
                            {
                                //获取 access_token
                                var tokenentity = *.accesstoken(new *_accesstoken_requestentity()
                                {
                                    code = authorizeresult.code
                                });

                                //获取 user
                                var userentity = *.user(new *_user_requestentity()
                                {
                                    access_token = tokenentity.access_token
                                });

                                openid = userentity.user_id;
                            }
                            break;
                    }

                    //拿到登录标识
                    if (string.isnullorwhitespace(openid))
                    {
                        //to do
                    }
                }

            }
        }
    }
}

source