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

OSCHINA-MIRROR/QR-QrF.OAuth.WeChat

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 6.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 12:48 408d407

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 )

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

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