1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/QR-QrF.OAuth.WeChat

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

QrF.OAuth.WeChat

.net Core2.2 WebApi реализует авторизацию через OAuth2.0 для входа в систему с помощью WeChat.

Введение

Конфигурацию, связанную с WeChat, можно найти в статье на платформе WeChat Public. Обратите внимание, что необходимо правильно изменить домен обратного вызова. Авторизация через веб-страницу WeChat реализуется через механизм OAuth2.0, поэтому мы можем использовать промежуточное ПО, предоставляемое открытым исходным кодом проекта https://github.com/china-live/QQConnect, чтобы реализовать процесс авторизации третьей стороны WeChat.

Процесс разработки

  1. Создайте новый проект .net core webapi. В NuGet найдите и установите пакет AspNetCore.Authentication.WeChat.
  2. Измените файл конфигурации appsettings.json и добавьте следующую конфигурацию:
"Authentication": {
    "WeChat": {
      "AppId": "微信AppID",
      "AppSecret": "微信AppSecret"
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Debug", //日志级别从低到高,依次为:Debug,Information,Warning,Error,None
      "Microsoft.EntityFrameworkCore": "Error",
      "System": "Error"
    }
  }
  1. Измените Startup:
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddAuthentication()
                .AddWeChat(wechatOptions =>
                {
                    wechatOptions.AppId = Configuration["Authentication:WeChat:AppId"];
                    wechatOptions.AppSecret = Configuration["Authentication:WeChat:AppSecret"];
                    wechatOptions.UseCachedStateDataFormat = true;
                });
  1. Добавьте AccountController:
    [Route("api/[controller]")]
    [ApiController]
    public class AccountController : ControllerBase
    {
        private const string LoginProviderKey = "LoginProvider";
        private const string Provider_WeChat = "WeChat";
        private readonly ILogger _logger;
        private readonly IHttpContextAccessor _contextAccessor;

        public AccountController(ILogger<AccountController> logger,
            IHttpContextAccessor contextAccessor)
        {
            _logger = logger;
            _contextAccessor = contextAccessor;
        }
        /// <summary>
        /// Авторизация через WeChat
        /// </summary>
        /// <param name="redirectUrl">Адрес перехода после успешной авторизации</param>
        /// <returns></returns>
        [HttpGet("LoginByWeChat")]
        public IActionResult LoginByWeChat(string redirectUrl)
        {
            var request = _contextAccessor.HttpContext.Request;
            var url = $"{request.Scheme}://{request.Host}{request.PathBase}{request.Path}Callback?provider={Provider_WeChat}&redirectUrl={redirectUrl}";
            var properties = new AuthenticationProperties { RedirectUri = url };
            properties.Items[LoginProviderKey] = Provider_WeChat;
            return Challenge(properties, Provider_WeChat);
        }
        /// <summary>
        /// Адрес автоматического обратного вызова после успешной авторизации через WeChat
        /// </summary>
        /// <param name="provider"></param>
        /// <param name="redirectUrl">Адрес перехода после успешной авторизации</param>
        /// <returns></returns>
        [HttpGet("LoginByWeChatCallback")]
        public async Task<IActionResult> LoginByWeChatCallbackAsync(string provider = null, string redirectUrl = "")
        {
            var authenticateResult = await _contextAccessor.HttpContext.AuthenticateAsync(provider);
            if (!authenticateResult.Succeeded) return Redirect(redirectUrl);
            var openIdClaim = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier);
            if (openIdClaim == null || openIdClaim.Value.IsNullOrWhiteSpace())
                return Redirect(redirectUrl);
            //TODO 记录 успешной авторизации через WeChat 
            var city = authenticateResult.Principal.FindFirst("urn:wechat:city")?.Value;
            var country = authenticateResult.Principal.FindFirst(ClaimTypes.Country)?.Value;
            var headimgurl = authenticateResult.Principal.FindFirst(ClaimTypes.Uri)?.Value;
            var nickName = authenticateResult.Principal.FindFirst(ClaimTypes.Name)?.Value;
            var openId = authenticateResult.Principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
            var privilege = authenticateResult.Principal.FindFirst("urn:wechat:privilege")?.Value;
            var province = authenticateResult.Principal.FindFirst("urn:wechat:province")?.Value;
            var sexClaim = authenticateResult.Principal.FindFirst(ClaimTypes.Gender);
            int sex = 0; ```
if (sexClaim != null && !sexClaim.Value.IsNullOrWhiteSpace())
    sex = int.Parse(sexClaim.Value);
var unionId = authenticateResult.Principal.FindFirst("urn:wechat:unionid")?.Value;
_logger.LogDebug($"WeChat Info=> openId: {openId},nickName: {nickName}");
return Redirect($"{redirectUrl}?openId={openIdClaim.Value}");
}
  1. Разместите сайт в интернете и запросите https://ваш авторизованный домен/api/account/LoginByWeChat?redirectUrl=страница, на которую нужно перейти после успешной авторизации, чтобы вызвать страницу авторизации через WeChat.

Примечание

Авторизация через WeChat должна осуществляться по протоколу HTTPS.

И открытая платформа WeChat, и публичная платформа WeChat предоставляют интерфейсы для входа через WeChat на веб-сайты. Первая подходит для любых сайтов, а вторая — только для встроенных сайтов в рамках официальных аккаунтов WeChat.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

.NET Core 2.2 Web API реализует авторизацию через OAuth 2.0 для входа через WeChat. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/QR-QrF.OAuth.WeChat.git
git@api.gitlife.ru:oschina-mirror/QR-QrF.OAuth.WeChat.git
oschina-mirror
QR-QrF.OAuth.WeChat
QR-QrF.OAuth.WeChat
master