ToB企服应用市场:ToB评测及商务社交产业平台

标题: 网站集成Github、Gitee登录 [打印本页]

作者: 金歌    时间: 7 天前
标题: 网站集成Github、Gitee登录
在现代应用开发中,第三方登录是常见的功能,可以低落用户登录的门槛,所以我给我的我的网站集成 github、gitee 登录教程,今天来看看如安在.net core 中集成 ,代码比力简朴,以此记录一下。
Github登录

设置 GitHub 认证

在 GitHub 上创建一个 应用,获取 Client ID 和 Client Secret。只必要在gitub的开发设置里面申请就好了,我觉得有的网站(包括gitee)第三方登录申请比力友好,直接注册,而且支持loaclhost的调试,大大的低落了难度。

页面设置按钮

页面设置按钮,点击登录图标跳转到https://gitee.com/oauth/authorize,这个地址是固定的
代码如下
  1. window.location.href = "https://github.com/login/oauth/authorize?client_id=" + appId;
复制代码
其中appId是你申请的clientId
跳转之后,会主动跳到你的回调页面然后携带一个code,然后你拿到这个code就可以
获取accessToken了
请求AccessToken

请求后台接口,把code传过去
  1. const loading = loadService.openFullLoading('登录认证中...');
  2.     let code = route.query.code;
  3.     let loginType = route.query.openLoginType;
  4.     let params = {
  5.         code: code,
  6.         loginType: loginType
  7.     }
  8.     openLoginApi(params).then(res => {
  9.         window.location.href = import.meta.env.VITE_WEB_UI;
  10.         loadService.closeFullLoading(loading);
  11.     })
复制代码
请求accessToken的接口是https://github.com/login/oauth/access_token
代码如下
  1.   private async Task<string> GetAccessToken(string authorizationCode, string clientId, string clientSecret)
  2.         {
  3.             if (string.IsNullOrEmpty(authorizationCode))
  4.                 throw new AuthException("github认证登录失败:authorizationCode为空");
  5.             string apiUrl = $"https://github.com/login/oauth/access_token?client_id={clientId}&client_secret={clientSecret}&code={authorizationCode}";
  6.             HttpClient httpClient = new HttpClient();
  7.             httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
  8.             string response = await httpClient.GetStringAsync(apiUrl);
  9.             dynamic result = JsonConvert.DeserializeObject(response);
  10.             return result.access_token;
  11.         }
复制代码
其中 httpClient.DefaultRequestHeaders.Add("Accept", "application/json")你可以根据你的要求去设置header来得到的接口数据的格式
请根据AccessToken获取用户信息
  1. private async Task<GitHubUserInfo> GetGitHubUser(string accessToken)
  2.         {
  3.             string apiUrl = "https://api.github.com/user";
  4.             HttpClient httpClient = new HttpClient();
  5.             httpClient.DefaultRequestHeaders.Add("User-Agent", "xiandan");
  6.             httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
  7.             string response = await httpClient.GetStringAsync(apiUrl);
  8.             dynamic result = JsonConvert.DeserializeObject(response);
  9.             GitHubUserInfo gitHubUserInfo = new GitHubUserInfo();
  10.             gitHubUserInfo.LoginName= result.login;
  11.             gitHubUserInfo.AvtarUrl= result.avatar_url;
  12.             gitHubUserInfo.OpenID = result.id;
  13.             gitHubUserInfo.OpenAuthEnum = OpenAuthEnum.GitHub;
  14.             gitHubUserInfo.Sex = "男";
  15.             return gitHubUserInfo;
  16.         }
复制代码
其中httpClient.DefaultRequestHeaders.Add("User-Agent", "xiandan"),如果你不设置User-Agent的话,可能会出现接口403的情况,具体的根据本身的情况处理
保存用户信息而且登录

上面的方法返回了用户信息后,既可以执行你的业务操作了,如创建用户信息而且生成登录token,我的代码
  1. public async Task<LoginUser> CreateOpenUser(BaseOpenUserInfo openUserInfo)
  2.         {
  3.             var accountRepository = unitOfWork.GetRepository<Account>();
  4.             var userRepository = unitOfWork.GetRepository<User>();
  5.             var uploadFileRepository = unitOfWork.GetRepository<UploadFile>();
  6.             Account account = await accountRepository.SelectSingleAsync(s => s.AccountName == openUserInfo.OpenID);
  7.             UploadFile avatarFile = null;
  8.             User user = null;
  9.             if (account == null)
  10.             {
  11.                 RegisterUserDTO registerUserDto = CreateOpenUser(openUserInfo, ref avatarFile);
  12.                 var tup = CreateAccountUser(registerUserDto);
  13.                 account = tup.Item1;
  14.                 user = tup.Item2;
  15.                 await accountRepository.InsertAsync(account);
  16.                 await userRepository.InsertAsync(user);
  17.                 if (avatarFile != null)
  18.                 {
  19.                     avatarFile.Id = CreateEntityId();
  20.                     avatarFile.UserId = user.Id;
  21.                     avatarFile.EntityId = user.Id;
  22.                     await uploadFileRepository.InsertAsync(avatarFile);
  23.                 }
  24.                 await unitOfWork.CommitAsync();
  25.             }
  26.             else
  27.             {
  28.                 user = await userRepository.SelectSingleAsync(s => s.AccountId == account.Id);
  29.                 avatarFile = await uploadFileRepository.SelectSingleAsync(s => s.EntityId == user.Id && s.EntityName == EntityCode.UserEntityName);
  30.             }
  31.             LoginUser loginUser = CreateLoginUser(user, account, avatarFile);
  32.             return loginUser;
  33.         }
复制代码
Gitee登录

gitee登录基本上和github登录差不多,也支持loaclhost的调试
  1.   window.location.href = "https://gitee.com/oauth/authorize?client_id=" + clientId + "&redirect_uri=" + redirectUri + "&response_type=code";
复制代码
  1. private async Task<string> GetAccessToken(string code)
  2.         {
  3.             string url = $"https://gitee.com/oauth/token";
  4.             HttpClient client = new HttpClient();
  5.             FormUrlEncodedContent content = new FormUrlEncodedContent(new[]
  6.             {
  7.                 new KeyValuePair<string, string>("grant_type","authorization_code"),
  8.                 new KeyValuePair<string, string>("code",code),
  9.                 new KeyValuePair<string, string>("client_id",GiteeConfigOption.ClientId),
  10.                 new KeyValuePair<string, string>("client_secret",GiteeConfigOption.ClientSecret),
  11.                 new KeyValuePair<string, string>("redirect_uri",GiteeConfigOption.RedirectUri)
  12.             });
  13.             HttpResponseMessage response = await client.PostAsync(url, content);
  14.             if (response.IsSuccessStatusCode)
  15.             {
  16.                 string responseBody = await response.Content.ReadAsStringAsync();
  17.                 dynamic tokenResponse = JsonConvert.DeserializeObject(responseBody);
  18.                 return tokenResponse.access_token;
  19.             }
  20.             else
  21.             {
  22.                 throw new Exception($"获取访问令牌失败:{response.StatusCode}");
  23.             }
  24.         }
  25.         private async Task<GiteeUserInfo> GetGiteeUserInfo(string accessToken)
  26.         {
  27.             string url ="https://gitee.com/api/v5/user?access_token="+accessToken;
  28.             HttpClient httpClient = new HttpClient();
  29.             string response=await httpClient.GetStringAsync(url);
  30.             dynamic result = JsonConvert.DeserializeObject(response);
  31.             GiteeUserInfo giteeUserInfo = new GiteeUserInfo();
  32.             giteeUserInfo.OpenAuthEnum = OpenAuthEnum.Gitee;
  33.             giteeUserInfo.OpenID = result.id;
  34.             giteeUserInfo.Name= result.name;
  35.             giteeUserInfo.AvatarUrl = result.avatar_url;
  36.             giteeUserInfo.Sex = "男";
  37.             return giteeUserInfo;
  38.         }
复制代码
如许,基本的.net core 集成 GitHub、gitee 登录就完成了。
作者:程序员奶牛

个人开源网站:https://www.xiandanplay.com
源码地址:https://gitee.com/MrHanchichi/xian-dan

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4