Google“ GoogleWebAuthorizationBroker”显示错误重定向uri不匹配

时间:2019-03-13 08:59:39

标签: c# oauth-2.0 google-calendar-api google-oauth2 google-developers-console

我正在MVC(C#)中进行操作。我想访问用户Google日历,所以我用“访问日历”指定了一个按钮。当用户单击下面的按钮时,将调用代码以获取令牌(并保存)以访问日历数据。

 UserCredential credential;
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    new ClientSecrets
                    {
                        ClientId = "xxxxxx.apps.googleusercontent.com",
                        ClientSecret = "FxxxxxxxxxZ"
                    },
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath)).Result;

执行此方法时,我们应该重定向到同意屏幕,相反,我得到的错误为shown in this image

但是它显示的重定向URI我从未在控制台中指定。这些是我在Google Project控制台中指定的重定向uri。console settings 我在做错什么吗?如何正确重定向到权限屏幕?

1 个答案:

答案 0 :(得分:1)

重定向uri问题

您请求中的重定向uri为http://127.0.1:59693/authorize,您尚未将其添加到“授权重定向Uris”下。

您不能仅添加任何重定向uri。客户端库将自行构建此url。总是

host:port/authorize

应用程序类型

您可以创建几种类型的客户端,这些客户端旨在与不同类型的应用程序一起使用。用于连接这些客户端的代码也不同。

  • 已安装的应用程序-已在用户计算机上安装的应用程序
  • Web应用程序-托管在通过Web浏览器连接到用户的Web服务器中的应用程序。

已安装的应用程序

您正在使用GoogleWebAuthorizationBroker.AuthorizeAsync,它专用于已安装的应用程序。浏览器窗口将在机器本身上打开。如果您尝试将其托管在网络服务器上,则浏览器将尝试在服务器上打开并且不会向用户显示。

Web应用程序

您应该关注Web applications并使用GoogleAuthorizationCodeFlow

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; }
        }
    }
}