当我尝试让谷歌授权获取错误:网站发布时无效请求错误。认证 1.0

Posted

技术标签:

【中文标题】当我尝试让谷歌授权获取错误:网站发布时无效请求错误。认证 1.0【英文标题】:when I try to make google authorization get Error: invalid_request Error when site is published. Oauth 1.0 【发布时间】:2016-07-14 20:39:19 【问题描述】:

我已经完成了使用 Oauth 1.0 的 MVC 站点 当我尝试从本地主机(从调试模式)使用 google 帐户进行授权时,我可以流畅地进行授权,没有任何问题,但是当我在服务器上发布我的网站时出现一些问题,当我单击按钮“google LogIn”时出现错误。请看下面的屏幕。

请开发者帮我解决这个问题。坦克你

附: 192.168.77.155 - 这是我的内部服务器IP,但我无法想象为什么要显示它。

返回信息野兔:

internal class ExternalLoginResult : ActionResult
        
            public ExternalLoginResult(string provider, string returnUrl)
            
                Provider = provider;
                ReturnUrl = returnUrl;
            

            public string Provider  get; private set; 
            public string ReturnUrl  get; private set; 

            public override void ExecuteResult(ControllerContext context)
            
                OAuthWebSecurity.RequestAuthentication(Provider, ReturnUrl);
            
        

public ActionResult ExternalLoginCallback(string returnUrl)
        
            GooglePlusClient.RewriteRequest();

            var result = OAuthWebSecurity.VerifyAuthentication();
            if (result.IsSuccessful)
            
                ProfilePicture helper = new ProfilePicture();

                // name of the provider we just used
                OauthProvider provider = helper.GetProvider(result.Provider);
                if ((int)provider == 0)
                
                    Logger.Fatal("Unknown Oauth Provider try to SignIn. Check Providers Name (maybe it changeed)");
                    return null; //todo MessageBox for Unkown Provider, or something wrong
                
                // provider's unique ID for the user
                var uniqueUserID = result.ProviderUserId;
                // since we might use multiple identity providers, then 
                // our app uniquely identifies the user by combination of 
                // provider name and provider user id
                var uniqueID = provider + "/" + uniqueUserID;

                // we then log the user into our application
                // we could have done a database lookup for a 
                // more user-friendly username for our app
                FormsAuthentication.SetAuthCookie(uniqueID, false);

                string userName;
                string nameAndLsatName = string.Empty;
                var userDataFromProvider = result.ExtraData;
                if (provider.Equals(OauthProvider.Twitter))
                
                    userName = result.UserName;
                
                else
                
                    userName = userDataFromProvider["username"];
                    nameAndLsatName = userDataFromProvider["name"];
                

                //Check if user already is in Db with Provider
                var chekUserName = Uow.Users.Data.Where(x => x.UserName == userName && x.UserGroup.Id == (int)provider).FirstOrDefault();
                if (chekUserName == null)
                
                    MM.Data.Model.User user = new MM.Data.Model.User();

                    user.UserName = userName;
                    if (!provider.Equals(OauthProvider.Twitter))
                    
                        user.FirstName = nameAndLsatName.Split(' ')[0];
                        user.LastName = nameAndLsatName.Split(' ')[1];
                    
                    user.Email = userName; //it'a Email
                    if (provider.Equals(OauthProvider.Twitter))
                    
                        user.ShowNameAndLastName = false;
                    
                    else
                    
                        user.ShowNameAndLastName = true;
                    
                    user.GroupId = (int)provider;
                    if (provider.Equals(OauthProvider.Twitter))
                    
                        user.ProfilePicture = helper.GetImageInBytesByProvider(provider, userName);
                    
                    else
                    
                        user.ProfilePicture = helper.GetImageInBytesByProvider(provider, uniqueUserID);
                    
                    Uow.Users.Add(user);
                    Uow.SaveChanges();

                

                //Valid Login
                //todo need improvement
                var userModel = Uow.Users.GetSingle(x => x.UserName == userName && x.UserGroup.Id == (int)provider);
                Session["User"] = new LoggedUserModel
                
                    Id = userModel.Id,
                    UserName = userName,
                    ProfilePicture = userModel.ProfilePicture
                ;

                Session["UserId"] = userModel.Id;

                //FormsAuthentication.SetAuthCookie(useruserNamename, false);
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                
                    return Redirect(returnUrl);
                
                return RedirectToAction("Index", "Home");

                // return View("", result);
            
            return null; //need change
        

【问题讨论】:

【参考方案1】:

在您附加的屏幕截图中,我看到 redirect_uri 是您的 192.168.77.155 ip。如果您更正它,谷歌将重定向回正确的 IP 地址。

【讨论】:

我的网站不使用我的服务器内部 IP 无处 (192.168.77.155) 它不是公共 IP。 请发布您用来重定向到 Google 屏幕的代码 我认为这不是代码内疚,因为在 Localhost 中一切正常。但我已经更新了问题,请查看 您发布的将在回调中命中的方法的代码。我是说您的代码永远不会到达此方法,因为 redirect_url 具有服务器名称。我们需要弄清楚redirect_url 是如何构造的。您是否使用 Startup.Auth 来配置 Google 登录 我认为问题根本与代码无关。您要么拥有负载均衡器,并且选择了负载均衡器的 ip,要么服务器 IIS 配置不正确。您在此处显示的代码将始终具有相对路径(如您的代码中所写)。

以上是关于当我尝试让谷歌授权获取错误:网站发布时无效请求错误。认证 1.0的主要内容,如果未能解决你的问题,请参考以下文章

如何让谷歌跟踪直观地指示有错误的跨度

Spring Security JWT - 400 错误请求:“无效授权”“错误凭据”

尝试获取访问令牌时出现“请求无效,因为应用程序密钥与客户端令牌相同”错误

WebRequest C# 403 错误

cron 运行网站备份 google drive api 脚本时出现“无效授权”错误

观众无效错误