Google OAuth Api 未在登录时重定向

Posted

技术标签:

【中文标题】Google OAuth Api 未在登录时重定向【英文标题】:Google OAuth Api not redirecting on Login 【发布时间】:2018-05-06 06:51:32 【问题描述】:

我尝试使用 Google 身份验证服务对我的用户进行身份验证 当我在本地服务器上运行此代码时,它工作正常(它重定向到谷歌登录,并在成功登录后它在redirectPath 上的命中回调)。 但是当在生产服务器上发布此代码时,它就不起作用了。 当我调试这段代码时,我发现了它的重定向并在托管环境(应用程序发布的地方)打开了谷歌登录页面。

这是我的代码 - 请帮助

字符串重定向路径 = "http://localhost:1212/Admin/YouTubeIntegration/Success";

            UserCredential credential;
            using (var stream = new FileStream(Server.MapPath("/XmlFile/client_secrets.json"), FileMode.Open, FileAccess.Read))
            
                GoogleAuth.RedirectUri = redirecrPath;
                credential = await GoogleAuth.AuthorizeAsync(
                             GoogleClientSecrets.Load(stream).Secrets,
                             new[]  YouTubeService.Scope.Youtube, YouTubeService.Scope.YoutubeReadonly, YouTubeService.Scope.YoutubeUpload ,
                             "user",
                             CancellationToken.None,
                             new FileDataStore(this.GetType().ToString())
                         );
            

如果您需要更多信息,请告诉我。 提前致谢

【问题讨论】:

嗨,我已经尝试过实际的重定向路径还有 string redirecrPath = "dummy.production.com/Admin/YouTubeIntegration/Success"; 确保您在谷歌开发者控制台中设置了正确的重定向 uri @DaImTo 在生产 uri 路径的情况下它在服务器机器上打开而不是在客户端机器上 本地主机和你的服务器是两个不同的地方。本地主机将是localhost/whatever。服务器将是 yourwebsite/whatever 它到不同的重定向 uris 您似乎也在使用已安装客户端的代码,您应该使用网络代码developers.google.com/api-client-library/dotnet/guide/… 【参考方案1】:

从网页登录的代码与使用已安装的应用程序登录的代码不同。已安装的应用程序可以直接在当前机器上生成登录屏幕。如果您尝试在网络服务器上执行此操作,它将无法正常工作,以下是使用网络登录的代码

using System;
using System.Web.Mvc;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Drive.v2;
using Google.Apis.Util.Store;

namespace Google.Apis.Sample.MVC4

    public class AppFlowMetadata : FlowMetadata
    
        private static readonly IAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
                
                    ClientSecrets = new ClientSecrets
                    
                        ClientId = "PUT_CLIENT_ID_HERE",
                        ClientSecret = "PUT_CLIENT_SECRET_HERE"
                    ,
                    Scopes = new[]  DriveService.Scope.Drive ,
                    DataStore = new FileDataStore("Drive.Api.Auth.Store")
                );

        public override string GetUserId(Controller controller)
        
            // In this sample we use the session to store the user identifiers.
            // That's not the best practice, because you should have a logic to identify
            // a user. You might want to use "OpenID Connect".
            // You can read more about the protocol in the following link:
            // https://developers.google.com/accounts/docs/OAuth2Login.
            var user = controller.Session["user"];
            if (user == null)
            
                user = Guid.NewGuid();
                controller.Session["user"] = user;
            
            return user.ToString();

        

        public override IAuthorizationCodeFlow Flow
        
            get  return flow; 
        
    

复制自here

【讨论】:

谢谢你是对的,我已经实现了网络代码并且工作正常。 @Dalm 你能解释一下 DataStore = new FileDataStore("Drive.Api.Auth.Store"); 我很高兴它为你工作记得接受回答者 @Danish 你应该问第二个问题,但我在这里有一个教程daimto.com/google-net-filedatastore-demystified 我也有一堆数据存储在这里gist.github.com/LindaLawton/a11851d51f13addd70264d01be1928bf

以上是关于Google OAuth Api 未在登录时重定向的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 登录消息:“URL 被阻止:此重定向失败,因为重定向 URI 未在应用程序的客户端 OAuth 设置中列入白名单。”

Facebook 登录消息:“URL 被阻止:此重定向失败,因为重定向 URI 未在应用程序的客户端 OAuth 设置中列入白名单。”

反向代理后面的 .NET 6 OAuth 身份验证:质询时重定向 url 错误

Flutter:当应用程序处于后台但未在 iOS 中终止时,无法在通知单击时重定向到特定屏幕

Google oauth20 匿名回调函数未在 passport.use 块中执行

未为 Google OAUTH 登录配置访问权限