<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      網站集成Github、Gitee登錄

      在現代應用開發中,第三方登錄是常見的功能,可以降低用戶登錄的門檻,所以我給我的我的網站集成 github、gitee 登錄教程,今天來看看如何在.net core 中集成 ,代碼比較簡單,以此記錄一下。

      Github登錄

      配置 GitHub 認證

      在 GitHub 上創建一個 應用,獲取 Client ID 和 Client Secret。只需要在gitub的開發設置里面申請就好了,我覺得有的網站(包括gitee)第三方登錄申請比較友好,直接注冊,并且支持loaclhost的調試,大大的降低了難度。

      頁面配置按鈕

      頁面配置按鈕,點擊登錄圖標跳轉到https://gitee.com/oauth/authorize,這個地址是固定的
      代碼如下

      window.location. + appId;
      
      

      其中appId是你申請的clientId
      跳轉之后,會自動跳到你的回調頁面然后攜帶一個code,然后你拿到這個code就可以
      獲取accessToken了

      請求AccessToken

      請求后臺接口,把code傳過去

       const loading = loadService.openFullLoading('登錄認證中...');
          let code = route.query.code;
          let loginType = route.query.openLoginType;
          let params = {
              code: code,
              loginType: loginType
          }
          openLoginApi(params).then(res => {
              window.location.href = import.meta.env.VITE_WEB_UI;
              loadService.closeFullLoading(loading);
          })
      

      請求accessToken的接口是https://github.com/login/oauth/access_token

      代碼如下

        private async Task<string> GetAccessToken(string authorizationCode, string clientId, string clientSecret)
              {
                  if (string.IsNullOrEmpty(authorizationCode))
                      throw new AuthException("github認證登錄失?。篴uthorizationCode為空");
                  string apiUrl = $"https://github.com/login/oauth/access_token?client_id={clientId}&client_secret={clientSecret}&code={authorizationCode}";
                  HttpClient httpClient = new HttpClient();
                  httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
                  string response = await httpClient.GetStringAsync(apiUrl);
                  dynamic result = JsonConvert.DeserializeObject(response);
                  return result.access_token;
              }
      

      其中 httpClient.DefaultRequestHeaders.Add("Accept", "application/json")你可以根據你的要求去設置header來得到的接口數據的格式

      請根據AccessToken獲取用戶信息

      private async Task<GitHubUserInfo> GetGitHubUser(string accessToken)
              {
                  string apiUrl = "https://api.github.com/user";
                  HttpClient httpClient = new HttpClient();
                  httpClient.DefaultRequestHeaders.Add("User-Agent", "xiandan");
                  httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
                  string response = await httpClient.GetStringAsync(apiUrl);
                  dynamic result = JsonConvert.DeserializeObject(response);
                  GitHubUserInfo gitHubUserInfo = new GitHubUserInfo();
                  gitHubUserInfo.LoginName= result.login;
                  gitHubUserInfo.AvtarUrl= result.avatar_url;
                  gitHubUserInfo.OpenID = result.id;
                  gitHubUserInfo.OpenAuthEnum = OpenAuthEnum.GitHub;
                  gitHubUserInfo.Sex = "男";
                  return gitHubUserInfo;
      
              }
      

      其中httpClient.DefaultRequestHeaders.Add("User-Agent", "xiandan"),如果你不設置User-Agent的話,可能會出現接口403的情況,具體的根據自己的情況處理

      保存用戶信息并且登錄

      上面的方法返回了用戶信息后,既可以執行你的業務操作了,如創建用戶信息并且生成登錄token,我的代碼

       public async Task<LoginUser> CreateOpenUser(BaseOpenUserInfo openUserInfo)
              {
                  var accountRepository = unitOfWork.GetRepository<Account>();
                  var userRepository = unitOfWork.GetRepository<User>();
                  var uploadFileRepository = unitOfWork.GetRepository<UploadFile>();
                  Account account = await accountRepository.SelectSingleAsync(s => s.AccountName == openUserInfo.OpenID);
                  UploadFile avatarFile = null;
                  User user = null;
                  if (account == null)
                  {
                      RegisterUserDTO registerUserDto = CreateOpenUser(openUserInfo, ref avatarFile);
                      var tup = CreateAccountUser(registerUserDto);
                      account = tup.Item1;
                      user = tup.Item2;
                      await accountRepository.InsertAsync(account);
                      await userRepository.InsertAsync(user);
                      if (avatarFile != null)
                      {
                          avatarFile.Id = CreateEntityId();
                          avatarFile.UserId = user.Id;
                          avatarFile.EntityId = user.Id;
                          await uploadFileRepository.InsertAsync(avatarFile);
                      }
                      await unitOfWork.CommitAsync();
                  }
                  else
                  {
                      user = await userRepository.SelectSingleAsync(s => s.AccountId == account.Id);
                      avatarFile = await uploadFileRepository.SelectSingleAsync(s => s.EntityId == user.Id && s.EntityName == EntityCode.UserEntityName);
                  }
                  LoginUser loginUser = CreateLoginUser(user, account, avatarFile);
                  return loginUser;
              }
      

      Gitee登錄

      gitee登錄基本上和github登錄差不多,也支持loaclhost的調試

        window.location. + clientId + "&redirect_uri=" + redirectUri + "&response_type=code";
      
      
       private async Task<string> GetAccessToken(string code)
              {
                  string url = $"https://gitee.com/oauth/token";
                  HttpClient client = new HttpClient();
                  FormUrlEncodedContent content = new FormUrlEncodedContent(new[]
                  {
                      new KeyValuePair<string, string>("grant_type","authorization_code"),
                      new KeyValuePair<string, string>("code",code),
                      new KeyValuePair<string, string>("client_id",GiteeConfigOption.ClientId),
                      new KeyValuePair<string, string>("client_secret",GiteeConfigOption.ClientSecret),
                      new KeyValuePair<string, string>("redirect_uri",GiteeConfigOption.RedirectUri)
                  });
                  HttpResponseMessage response = await client.PostAsync(url, content);
                  if (response.IsSuccessStatusCode)
                  {
                      string responseBody = await response.Content.ReadAsStringAsync();
                      dynamic tokenResponse = JsonConvert.DeserializeObject(responseBody);
                      return tokenResponse.access_token;
                  }
                  else
                  {
                      throw new Exception($"獲取訪問令牌失敗:{response.StatusCode}");
                  }
              }
              private async Task<GiteeUserInfo> GetGiteeUserInfo(string accessToken)
              {
                  string url ="https://gitee.com/api/v5/user?access_token="+accessToken;
                  HttpClient httpClient = new HttpClient();
                  string response=await httpClient.GetStringAsync(url);
                  dynamic result = JsonConvert.DeserializeObject(response);
                  GiteeUserInfo giteeUserInfo = new GiteeUserInfo();
                  giteeUserInfo.OpenAuthEnum = OpenAuthEnum.Gitee;
                  giteeUserInfo.OpenID = result.id;
                  giteeUserInfo.Name= result.name;
                  giteeUserInfo.AvatarUrl = result.avatar_url;
                  giteeUserInfo.Sex = "男";
                  return giteeUserInfo;
              }
      

      這樣,基本的.net core 集成 GitHub、gitee 登錄就完成了。

      作者:程序員奶牛

      個人開源網站:https://www.xiandanplay.com
      源碼地址:https://gitee.com/MrHanchichi/xian-dan

      posted @ 2025-02-22 11:31  灬丶  閱讀(226)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 欧美成人精品一级在线观看| 人妻少妇精品专区性色av| 五月丁香激激情亚洲综合| 性高湖久久久久久久久| 网友自拍视频一区二区三区| 日韩少妇人妻vs中文字幕| 国产精品亚洲中文字幕| 免费久久人人爽人人爽AV| 国产成人啪精品午夜网站| 国产乱久久亚洲国产精品| 最近免费中文字幕mv在线视频3| 好吊视频在线一区二区三区| 国产成人一区二区三区在线| 国产av亚洲精品ai换脸电影| 少妇的丰满3中文字幕| 成人无码视频| 欧洲一区二区中文字幕| 国产卡一卡二卡三免费入口| 日韩乱码人妻无码中文字幕视频| 大胸美女吃奶爽死视频| 高中女无套中出17p| 国产成人免费ā片在线观看| 国产精品妇女一区二区三区 | 天堂网av成人在线观看| 中文午夜乱理片无码| 国产超碰无码最新上传| 人妻在线无码一区二区三区 | 99中文字幕精品国产| 美女一区二区三区亚洲麻豆| 久久九九久精品国产免费直播| 亚洲一区二区日韩综合久久| 久久无码中文字幕免费影院蜜桃| 日韩成人一区二区二十六区| 欧美肥老太交视频免费| 人妻少妇久久中文字幕| 日本深夜福利在线观看| 色午夜一av男人的天堂| 国产亚洲精品综合一区二区 | 高清自拍亚洲精品二区| 又大又粗欧美成人网站| 日本三线免费视频观看|