.NET 6中使用AddOAuth()集成GitHub OAuth2缺失Refresh Token问题
解决GitHub OAuth授权码流程无法获取Refresh Token的问题
核心问题说明
GitHub传统OAuth Apps已取消单独的刷新令牌opt-in开关,需满足两个关键条件才能获取Refresh Token:
- 必须请求
offline_access权限范围 - 授权请求中必须显式携带
access_type=offline参数(这是多数人忽略的核心点)
.NET 6 AddOAuth配置修正步骤
- 在
AddOAuth配置中,需手动为授权端点追加access_type=offline参数,并确保添加offline_access权限:
services.AddAuthentication() .AddOAuth("GitHub", options => { options.ClientId = "你的ClientId"; options.ClientSecret = "你的ClientSecret"; options.CallbackPath = "/signin-github"; // 为授权端点添加access_type=offline参数 options.AuthorizationEndpoint = "https://github.com/login/oauth/authorize?access_type=offline"; options.TokenEndpoint = "https://github.com/login/oauth/access_token"; options.UserInformationEndpoint = "https://api.github.com/user"; // 加入offline_access权限范围 options.Scope.Add("offline_access"); options.Scope.Add("repo"); // 按需添加其他业务所需权限 // 捕获并保存Refresh Token options.Events = new OAuthEvents { OnCreatingTicket = context => { var refreshToken = context.TokenResponse?.RefreshToken; if (!string.IsNullOrEmpty(refreshToken)) { context.Properties.StoreTokens(new[] { new AuthenticationToken { Name = "refresh_token", Value = refreshToken } }); } return Task.CompletedTask; } }; });
- 补充:GitHub OAuth Apps返回的Refresh Token为长期有效,除非用户主动撤销授权或你手动吊销令牌。
常见误区排查
- 不要混淆OAuth Apps和GitHub Apps:仅GitHub Apps设有单独的刷新令牌opt-in开关,传统OAuth Apps无需此操作。
- 确认授权请求中确实包含
access_type=offline,AddOAuth默认不会自动添加该参数,需手动追加。 - 检查权限范围是否正确配置
offline_access,缺少此范围将无法触发Refresh Token返回。
内容的提问来源于stack exchange,提问作者subi_speedrunner
相关产品推荐
相关产品推荐

