MrHuo.OAuth
.NETプロジェクトにOAuth2ログインを統合するための、最も包括的で便利なフレームワークです

.NET Core プロジェクトまたは .NET Framework 4.6 プロジェクトで使用可能
体験サイト:https://oauthlogin.net/
サポート済みプラットフォーム
- 百度(利用可能)
- WeChat 公式アカウント(利用可能)
- Gitlab(利用可能)
- Gitee(利用可能)
- GitHub(利用可能)
- 華為(利用可能)
- Coding.net(利用可能)
- Sina Weibo(利用可能)
- Alipay(利用可能)
- OSChina(利用可能)
- Xunlei(利用可能)
- DingTalk 内部ログイン(利用可能)
- DingTalk QRコードログイン(利用可能)
- QQ(利用可能)
- Microsoft(利用可能)
- Xiaomi(利用可能)
- StackOverflow(利用可能)
- Facebook(利用可能)by Donma Hsu
- Google(利用可能)
- LinkedIn(利用可能、NuGet公開待ち)
- Douyin(利用可能、NuGet公開待ち)by feng lui
- Kuaishou(利用可能、NuGet公開待ち)by feng lui
- WeChat オープンプラットフォーム(テスト待ち)
- 美団(テスト待ち)
計画
- 飛書
- 淘宝
- 西瓜
- 今日頭条
- 人人網
- Teambition
- 企業微信QRコードログイン
- 企業微信Webログイン
- 酷家楽
- 餓了麼
- 京東
- 阿里雲
- 喜馬拉雅...
使用方法
新しいWebプロジェクトを作成し、
nugetパッケージをインストールするだけで使用できます。
現在利用可能な nuget パッケージの一覧:
https://www.nuget.org/packages?q=MrHuo.OAuth
Gitlab
Install-Package MrHuo.OAuth.Gitlab -Version 1.1.1
WeChat 公式アカウント
Install-Package MrHuo.OAuth.Wechat -Version 1.1.1
oschina.net
Install-Package MrHuo.OAuth.OSChina -Version 1.1.1
coding.net
Install-Package MrHuo.OAuth.Coding -Version 1.1.1
github.com
Install-Package MrHuo.OAuth.GitHub -Version 1.1.1
alipay.com
Install-Package MrHuo.OAuth.Alipay -Version 1.1.1
baidu.com
Install-Package MrHuo.OAuth.Baidu -Version 1.1.1
huawei.com
Install-Package MrHuo.OAuth.Huawei -Version 1.1.1
gitee.com
Install-Package MrHuo.OAuth.Gitee -Version 1.1.1
weibo.com
Install-Package MrHuo.OAuth.SinaWeibo -Version 1.1.1
xunlei.com
Install-Package MrHuo.OAuth.XunLei -Version 1.1.1
qq.com
Install-Package MrHuo.OAuth.QQ -Version 1.1.1
microsoft.com
Install-Package MrHuo.OAuth.Microsoft -Version 1.1.1
mi.com
Install-Package MrHuo.OAuth.Mi -Version 1.1.1
stackoverflow.com
Install-Package MrHuo.OAuth.StackOverflow -Version 1.1.1
facebook.com
Install-Package MrHuo.OAuth.Facebook -Version 1.1.1
google.com
Install-Package MrHuo.OAuth.Google -Version 1.0.0
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// 第三方ログインコンポーネントを注入
services.AddSingleton(new Baidu.BaiduOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:baidu")));
services.AddSingleton(new Wechat.WechatOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:wechat")));
services.AddSingleton(new Gitlab.GitlabOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:gitlab")));
services.AddSingleton(new Gitee.GiteeOAuth(OAuthConfig.LoadFrom(Configuration, "oauth:gitee")));
//... その他のログイン方法
}
注意:appsettings.json 経由で設定を読み込む場合、便利なメソッドが用意されています。
OAuthConfig.LoadFrom(Configuration, "oauth:baidu")
"oauth:baidu" の部分は設定のプレフィックスで、設定形式は以下の通りです:
{
"oauth": {
"qq": {
"app_id": "qq_app_id",
"app_key": "qq_app_key",
"redirect_uri": "https://oauthlogin.net/oauth/qqcallback",
"scope": "get_user_info"
},
"github": {
"app_id": "github_app_id",
"app_key": "github_app_key",
"redirect_uri": "https://oauthlogin.net/oauth/githubcallback",
"scope": "repo"
},
"wechat": {
"app_id": "wechat_app_id",
"app_key": "wechat_app_key",
"redirect_uri": "https://oauthlogin.net/oauth/wechatcallback",
"scope": "snsapi_userinfo"
},
"huawei": {
"app_id": "huawei_app_id",
"app_key": "huawei_app_key",
"redirect_uri": "https://oauthlogin.net/oauth/huaweicallback",
"scope": "https://www.huawei.com/auth/account"
},
"gitee": {
"app_id": "gitee_app_id",
"app_key": "gitee_app_key",
"redirect_uri": "http://oauthlogin.net/oauth/giteecallback",
"scope": "user_info"
},
"baidu": {
"app_id": "baidu_app_id",
"app_key": "baidu_app_key",
"redirect_uri": "http://oauthlogin.net/oauth/baiducallback",
"scope": "basic"
},
"alipay": {
"app_id": "alipay_app_id",
"app_key": "alipay_app_key",
"redirect_uri": "https://oauthlogin.net/oauth/alipaycallback",
"scope": "auth_user",
"private_key": "private_key",
"public_key": "public_key"
},
"gitlab": {
"app_id": "gitlab_app_id",
"app_key": "gitlab_app_key",
"redirect_uri": "http://oauthlogin.net/oauth/gitlabcallback",
"scope": "read_user"
}
}
}
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;
}
case "wechat":
{
redirectUrl = wechatOAuth.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);
}
}
}
Views
<!-- コード内に認証ボタンを配置 -->
<a href="/oauth/baidu">Baidu ログイン</a>
<a href="/oauth/wechat">WeChat QRコードログイン</a>
<!-- //他のログイン方法も同様に追加 -->
拡張
他のプラットフォームの拡張は非常に簡単です。例として Gitee プラットフォームのコードを示します:https://github.com/mrhuo/MrHuo.OAuth/tree/main/MrHuo.OAuth.Gitee
ステップ1:プラットフォームのOAuthドキュメントから、ユーザー情報取得APIが返す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; }
//...その他のプロパティも同様
}
ステップ2:対応プラットフォームの認証インターフェースを実装
/// <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";
}
コメントを含めてもたった10行。ご覧のとおり非常に簡単です。プラットフォームがOAuth2標準に従っていれば、これだけで完了です。
例えば、フィールドを修正する必要があるWeChatログインの実装でも、基本パラメータを定義するだけです。コードは以下の通り:
/// <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",
};
}
}
特別貢献者
皆様が様々なプラットフォームのログインコンポーネントを問題なく利用できるよう、テスト用の各種プラットフォームのAPPIDを緊急で募集しています。ご提供いただける方はご連絡ください。 テスト用APPIDを提供していただいた方は、プロジェクトのトップページの特別貢献者リストに永続的に掲載されます(リンク付き可能)。
メール:admin@mrhuo.com 備考:OAuth Appid
Contribution
- 開発への参加や、未完成のプラットフォームコードの貢献を歓迎します。
- Issueにてリクエストプラットフォームを提出してください(プラットフォームのリンクを添えて)。計画に追加します。
- 様々な提案を歓迎します。丁寧なコミュニケーションをお願いします。
License
プロジェクトアドレス
- フレームワーク名:
MrHuo.OAuth - 作者:mrhuo
- GitHub:https://github.com/mrhuo/MrHuo.OAuth
