【问题标题】:Google Drive SDK 1.8.1 RedirectURL谷歌云端硬盘 SDK 1.8.1 重定向网址
【发布时间】:2014-11-25 22:48:55
【问题描述】:

有没有办法提供 RedirectURL 然后使用 GoogleWebAuthorizationBroker?

这是 C# 中的示例代码:

Task<UserCredential> credential = GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, scopes, GoogleDataStore.User, cancellationToken, dataStore);

或者我们必须使用不同的方法?

我有一个在用户桌面上运行的“已安装应用程序”,而不是在网站上。默认情况下,当我在 API 控制台中创建“已安装的应用程序”项目时,重定向 URI 似乎默认设置为本地主机。

最终发生的是,在身份验证序列之后,用户被重定向到 localhost 并收到浏览器错误。我想通过提供我自己的重定向 URI 来防止这种情况发生:urn:ietf:wg:oauth:2.0:oob:auto

这似乎可以使用 Python 版本的 Google Client API,但我发现使用 .NET 很难找到对此的任何引用。

【问题讨论】:

    标签: google-api google-drive-api google-api-dotnet-client


    【解决方案1】:

    看看PromptCodeReceiver的实现,你可以看到它包含重定向uri。

    您可以使用您喜欢的重定向 uri 实现自己的 ICodeReceiver,并从类似于 GoogleWebAuthorizationBroker 的 WebBroker 调用它。

    我认为理解为什么不能只使用 PrompotCodeReceiver 或 LocalServerCodeReceiver 会很棒。

    请注意,我们上周刚刚发布了一个新库,因此您应该将其更新到 1.9.0。

    更新(更多详情,2014 年 11 月 25 日):

    您可以创建自己的 ICodeReceiver。您必须执行以下操作:
    * 代码从未经过测试...抱歉。

    public class MyNewCodeReceiver : ICodeReceiver
    {
        public string RedirectUri
        {
            get { return YOU_REDIRECT_URI; }
        }
    
        public Task<AuthorizationCodeResponseUrl> ReceiveCodeAsync(
          AuthorizationCodeRequestUrl url,
          CancellationToken taskCancellationToken)
        {
            // YOUR CODE HERE FOR RECEIVING CODE FROM THE URL.
            // TAKE A LOOK AT THE FOLLOWING:
            // PromptCodeReceiver AND LocalServerCodeReceiver
            // FOR EXAMPLES.
        }
    }
    

    PromptCodeReceiverLocalServerCodeReceiver

    那么你将不得不做以下事情 (而不是使用 GoogleWebAuthorizationBroker.AuthorizeAsync 方法):

    var initializer = new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = secrets,
        Scopes = scopes,
        DataStore = new FileDataStore("Google.Apis.Auth");
    };
    await new AuthorizationCodeInstalledApp(
            new GoogleAuthorizationCodeFlow(initializer),
            new MyNewCodeReceiver())
        .AuthorizeAsync(user, taskCancellationToken);
    

    另外:

    1. 我很乐意进一步了解您为什么需要设置不同的重定向 uri,以便我们能够相应地改进库。
    2. 当我创建已安装的应用程序时,当前的 PromptCodeReceiver 和 LocalServerCodeReceiver 为我工作,所以我不确定您的代码有什么问题。

    【讨论】:

    • 如果您能详细说明答案,将会很有帮助。谷歌 .Net API 糟糕到了我刚刚放弃处理这些的程度。我无论如何都找不到传递我自己的重定向网址。可以在 python 或 php apis 中执行此操作,但不能在 .net apis 中执行。为什么? stackoverflow.com/questions/27119038/…。许多其他公司正在使用 OAuth2。使用他们的 api 从来没有任何问题。 Google api、文档、示例代码(充满错误)是最糟糕的。
    • 我更新了我的答案,请注意我们正在努力改进图书馆,所以任何具体的建议将不胜感激。随时在我们的问题跟踪器中打开一个新问题,解释您究竟需要什么 - code.google.com/p/google-api-dotnet-client/issues/list。请记住,该库是开源的,因此请随时贡献。
    • “我很高兴进一步了解您为什么需要设置不同的重定向 uri,因此我们将能够相应地改进库。” - 我不需要不同的重定向网址。我只需要有“重定向网址”。没有地方放一个。现在实现有一些 localhost/authorize 硬编码(为什么???)。我只是不明白。为什么不在现有的实现中放一个参数来允许用户传递重定向 url?
    • 查看LocalServerCodeReceiver的当前实现。它将redirect_url 放到localhost:<random port>/authorize。鉴于谷歌必须在控制台设置中找到相同的网址,您能否解释一下为什么这应该起作用?
    • 这不是随机的。这是我们使用 TCP 监听器监听的那个 - code.google.com/p/google-api-dotnet-client/source/browse/Src/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多