RuoVea.ExOAuth.Github 5.0.2

dotnet add package RuoVea.ExOAuth.Github --version 5.0.2                
NuGet\Install-Package RuoVea.ExOAuth.Github -Version 5.0.2                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="RuoVea.ExOAuth.Github" Version="5.0.2" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add RuoVea.ExOAuth.Github --version 5.0.2                
#r "nuget: RuoVea.ExOAuth.Github, 5.0.2"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install RuoVea.ExOAuth.Github as a Cake Addin
#addin nuget:?package=RuoVea.ExOAuth.Github&version=5.0.2

// Install RuoVea.ExOAuth.Github as a Cake Tool
#tool nuget:?package=RuoVea.ExOAuth.Github&version=5.0.2                

<h1 align="center">RuoVea.OAuth</h1> <p align="center">是 .Net Core 项目集成 第三方OAuth2 登录全面的、方便的框架</p>

<div align="center">

Travis (.org) GitHub stars GitHub license

</div>

.net core 5.0 以上项目可用

<hr />

已支持平台

  • Gitee
  • Github
  • 百度

计划

  • 微信公众号
  • Gitlab
  • 华为
  • Coding.net
  • 新浪微博
  • 支付宝
  • OSChina
  • 迅雷
  • 钉钉内登录
  • 钉钉扫码登录
  • QQ
  • 微软
  • 小米
  • StackOverflow
  • Facebook
  • Google
  • LinkedIn
  • 抖音
  • 快手
  • 微信开放平台
  • 美团
  • 飞书
  • 淘宝
  • 西瓜
  • 今日头条
  • 人人网
  • Teambition
  • Pinterest
  • Twitter
  • 企业微信二维码登录
  • 企业微信网页登录
  • 酷家乐
  • 饿了么
  • 京东
  • 阿里云
  • 喜马拉雅...

使用方法

新建项目web项目,安装 nuget 包即可使用。

现可用的 nuget 包列表如下:

https://www.nuget.org/packages?q=RuoVea

1.Startup.cs

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 方式引入,提供了一个快捷方法从配置中加载。

OAuthConfig.LoadFrom(Configuration, "oauth:baidu")

"oauth:baidu" 这部分是配置前缀,配置格式如下:

{
  "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 根据实际需要自行命名

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<IActionResult> 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


<a href="/oauth/baidu">Baidu 登录</a>
<a href="/oauth/wechat">Wechat 扫码登录</a>

扩展

扩展其他平台非常容易,拿 Gitee 平台的代码来说:

第一步:找平台对应 OAuth 文档,找到获取用户信息接口返回JSON,转换为 C# 实体类。如下:

根据自己需要和接口标准,扩展用户属性

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; }

    //...其他属性类似如上
}
第二步:写对应平台的授权接口
/// <summary>
/// https://gitee.com/api/v5/oauth_doc#/
/// </summary>
public class GiteeOAuth : OAuthLoginBase<GiteeUserModel>
{
    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。代码如下:

/// <summary>
/// Wechat OAuth 相关文档参考:
/// <para>https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html</para>
/// </summary>
public class WechatOAuth : OAuthLoginBase<WechatAccessTokenModel, WechatUserInfoModel>
{
    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<string, string> BuildAuthorizeParams(string state)
    {
        return new Dictionary<string, string>()
        {
            ["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<string, string> BuildGetAccessTokenParams(Dictionary<string, string> authorizeCallbackParams)
    {
        return new Dictionary<string, string>()
        {
            ["grant_type"] = "authorization_code",
            ["appid"] = $"{oauthConfig.AppId}",
            ["secret"] = $"{oauthConfig.AppKey}",
            ["code"] = $"{authorizeCallbackParams["code"]}"
        };
    }
    protected override Dictionary<string, string> BuildGetUserInfoParams(WechatAccessTokenModel accessTokenModel)
    {
        return new Dictionary<string, string>()
        {
            ["access_token"] = accessTokenModel.AccessToken,
            ["openid"] = accessTokenModel.OpenId,
            ["lang"] = "zh_CN",
        };
    }
}

<hr /> 为了能让各位朋友能顺利的使用各种平台登录组件,先急求各种平台的 APPID 做测试,有这方面资源的朋友联系我。 提供测试的朋友,可以永久出现在项目首页特别贡献列表里,可带链接。

ruovea@qq.com

备注:OAuth Appid

Contribution

1.欢迎参与开发,贡献其他未完成平台代码。 2.欢迎在 issue 里提交需求平台,带上平台链接地址,我们将加入到计划之中。 3.欢迎提交各种建议,文明交流。

License

<a href="https://gitee.com/starry123/ruovea-oauth/blob/master/LICENSE" class="muted-link">Apache-2.0 License</a>

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
5.0.2 299 12/24/2021
5.0.1 240 12/23/2021