# 第三方登录集成OAuth **Repository Path**: starry123/ruovea-oauth ## Basic Information - **Project Name**: 第三方登录集成OAuth - **Description**: 第三方登录集成的OAuth,将陆续支持:百度登录、 微信公众号登录、Gitlab登录、 Gitee登录、Github登录、华为登录、Coding.net登录、新浪微博登录、 支付宝登录、OSChina登录、 迅雷登录、钉钉内登录、钉钉扫码登录、QQ登录、 微软登录、 小米登录 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 14 - **Forks**: 12 - **Created**: 2021-12-23 - **Last Updated**: 2025-01-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

RuoVea.ExOAuth

是 .Net Core 项目集成 第三方OAuth2 登录全面的、方便的框架

> .net core 5.0 以上项目可用
## 已支持平台 - [ ✔ ] Gitee - [ ✔ ] Github - [ ✔ ] 百度 - [ ✔ ] Coding.net - [ ✔ ] 支付宝 - [ ✔ ] 飞书 - [ ✔ ] 钉钉内登录 - [ ✔ ] 抖音 - [ ✔ ] 钉钉扫码登录 - [ ✔ ] 微软 - [ ✔ ] 微信公众号 - [ ✔ ] Gitlab - [ ✔ ] 华为 - [ ✔ ] 新浪微博 - [ ✔ ] OSChina - [ ✔ ] 迅雷 - [ ✔ ] QQ - [ ✔ ] 小米 - [ ✔ ] StackOverflow - [ ✔ ] Facebook - [ ✔ ] Google - [ ✔ ] LinkedIn - [ ✔ ] 美团 ## 计划 - ☐ 快手 - ☐ 微信开放平台 - ☐ 淘宝 - ☐ 西瓜 - ☐ 今日头条 - ☐ 人人网 - ☐ Teambition - ☐ Pinterest - ☐ Twitter - ☐ 企业微信二维码登录 - ☐ 企业微信网页登录 - ☐ 酷家乐 - ☐ 饿了么 - ☐ 京东 - ☐ 阿里云 - ☐ 喜马拉雅... ## 使用方法 > 新建项目web项目,安装 `nuget` 包即可使用。 现可用的 `nuget` 包列表如下: [https://www.nuget.org/packages?q=RuoVea](https://www.nuget.org/packages?q=RuoVea) 1.`Startup.cs` ```csharp public void ConfigureServices(IServiceCollection services) { //将第三方登录组件注入进去 services.AddSingleton(new Baidu.BaiduOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:gitee"))); services.AddSingleton(new Gitee.GiteeOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:github"))); //... 其他登录方式 } ``` 注意:如果用 `appsettings.json` 方式引入,提供了一个快捷方法从配置中加载。 ```csharp OAuthConfig.LoadFrom(Configuration, "oauth:baidu") ``` `"oauth:baidu"` 这部分是配置前缀,配置格式如下: ```json { "oauth": { "github": { "app_id": "github_app_id", "app_key": "github_app_key", "redirect_uri": "https://ruovea.com/oauth/githubcallback", "scope": "repo" }, "gitee": { "app_id": "gitee_app_id", "app_key": "gitee_app_key", "redirect_uri": "https://ruovea.com/oauth/giteecallback", "scope": "user_info" } } } ``` 2.`OAuthController.cs` 根据实际需要自行命名 ```csharp public class OAuthController : Controller { [HttpGet("oauth/{type}")] public IActionResult Index( string type, [FromServices] BaiduOAuth baiduOAuth, [FromServices] WechatOAuth wechatOAuth ) { var redirectUrl = ""; switch (type.ToLower()) { case "baidu": { redirectUrl = baiduOAuth.GetAuthorizeUrl(); break; } default: return ReturnToError($"没有实现【{type}】登录方式!"); } return Redirect(redirectUrl); } [HttpGet("oauth/{type}callback")] public async Task LoginCallback( string type, [FromServices] BaiduOAuth baiduOAuth, [FromServices] WechatOAuth wechatOAuth, [FromQuery] string code, [FromQuery] string state) { try { switch (type.ToLower()) { case "baidu": { var authorizeResult = await baiduOAuth.AuthorizeCallback(code, state); if (!authorizeResult.IsSccess) { throw new Exception(authorizeResult.ErrorMessage); } return Json(authorizeResult); } case "wechat": { var authorizeResult = await wechatOAuth.AuthorizeCallback(code, state); if (!authorizeResult.IsSccess) { throw new Exception(authorizeResult.ErrorMessage); } return Json(authorizeResult); } default: throw new Exception($"没有实现【{type}】登录回调!"); } } catch (Exception ex) { return Content(ex.Message); } } } ``` 3.`Views` ```html Baidu 登录 Wechat 扫码登录 ``` ## 扩展 扩展其他平台非常容易,拿 `Gitee` 平台的代码来说: ##### 第一步:找平台对应 OAuth 文档,找到获取用户信息接口返回JSON,转换为 C# 实体类。如下: > 根据自己需要和接口标准,扩展用户属性 ```csharp public class GiteeUserModel : IUserInfoModel { [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("avatar_url")] public string Avatar { get; set; } [JsonPropertyName("message")] public string ErrorMessage { get; set; } [JsonPropertyName("email")] public string Email { get; set; } [JsonPropertyName("blog")] public string Blog { get; set; } //...其他属性类似如上 } ``` ##### 第二步:写对应平台的授权接口 ```csharp /// /// https://gitee.com/api/v5/oauth_doc#/ /// public class GiteeOAuth : OAuthLoginBase { public GiteeOAuth(OAuthConfig oauthConfig) : base(oauthConfig) { } protected override string AuthorizeUrl => "https://gitee.com/oauth/authorize"; protected override string AccessTokenUrl => "https://gitee.com/oauth/token"; protected override string UserInfoUrl => "https://gitee.com/api/v5/user"; } ``` 加上注释,总共十行,如你所见,非常方便。如果该平台协议遵循 OAuth2 标准开发,那么就这么几行就好了。 就连修改字段的微信登录实现,也不过复杂,只需要定义基本参数就OK。代码如下: ```csharp /// /// Wechat OAuth 相关文档参考: /// https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html /// public class WechatOAuth : OAuthLoginBase { public WechatOAuth(OAuthConfig oauthConfig) : base(oauthConfig) { } protected override string AuthorizeUrl => "https://open.weixin.qq.com/connect/oauth2/authorize"; protected override string AccessTokenUrl => "https://api.weixin.qq.com/sns/oauth2/access_token"; protected override string UserInfoUrl => "https://api.weixin.qq.com/sns/userinfo"; protected override Dictionary BuildAuthorizeParams(string state) { return new Dictionary() { ["response_type"] = "code", ["appid"] = oauthConfig.AppId, ["redirect_uri"] = System.Web.HttpUtility.UrlEncode(oauthConfig.RedirectUri), ["scope"] = oauthConfig.Scope, ["state"] = state }; } public override string GetAuthorizeUrl(string state = "") { return $"{base.GetAuthorizeUrl(state)}#wechat_redirect"; } protected override Dictionary BuildGetAccessTokenParams(Dictionary authorizeCallbackParams) { return new Dictionary() { ["grant_type"] = "authorization_code", ["appid"] = $"{oauthConfig.AppId}", ["secret"] = $"{oauthConfig.AppKey}", ["code"] = $"{authorizeCallbackParams["code"]}" }; } protected override Dictionary BuildGetUserInfoParams(WechatAccessTokenModel accessTokenModel) { return new Dictionary() { ["access_token"] = accessTokenModel.AccessToken, ["openid"] = accessTokenModel.OpenId, ["lang"] = "zh_CN", }; } } ```
为了能让各位朋友能顺利的使用各种平台登录组件,先急求各种平台的 APPID 做测试,有这方面资源的朋友联系我。 提供测试的朋友,可以永久出现在项目首页特别贡献列表里,可带链接。 ruovea@qq.com 备注:OAuth Appid ## Contribution 1.欢迎参与开发,贡献其他未完成平台代码。 2.欢迎在 issue 里提交需求平台,带上平台链接地址,我们将加入到计划之中。 3.欢迎提交各种建议,文明交流。 ### 支持第三方登录
三方参考文档应用申请(已登录)
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
参考文档 应用申请
## License Apache-2.0 License