Google 数据 API 授权重定向 URI 不匹配

Google Data API Authorization Redirect URI Mismatch(Google 数据 API 授权重定向 URI 不匹配)

本文介绍了Google 数据 API 授权重定向 URI 不匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

背景

我想在 .NET Core 1.1 中编写一个小型的个人 Web 应用程序来与 YouTube 交互并使我更容易做一些事情,我正在关注

解决方案

原始答案有效,但它不是 ASP.NET Web 应用程序的最佳方法.有关处理 ASP.NET Web 应用程序流的更好方法,请参阅下面的更新.

<小时>

原答案

所以,我想通了.问题在于 Google 将 Web 应用程序视为基于 JavaScript 的 Web 应用程序,而不是具有服务器端处理功能的 Web 应用程序.因此,您不能在 Google Developer Console 中为基于服务器的 Web 应用程序创建 Web 应用程序 OAuth 客户端 ID.

解决方法是在 Google Developer Console 中创建 OAuth Client ID 时选择类型Other.这将使 Google 将其视为已安装的应用程序而不是 JavaScript 应用程序,因此不需要重定向 URI 来处理回调.

这有点令人困惑,因为 Google 的 .NET 文档告诉您创建 Web 应用 OAuth 客户端 ID.

<小时>

2018 年 2 月 16 日更新了更好的答案:

我想提供对此答案的更新.虽然,我上面所说的有效,但这并不是为 ASP.NET 解决方案实现 OAuth 工作流的最佳方式.有一种更好的方法可以实际使用适当的 OAuth 2.0 流程.Google 的文档在这方面很糟糕(尤其是对于 .NET),所以我将在这里提供一个简单的实现示例.该示例使用 ASP.NET 核心,但它很容易适应完整的 .NET 框架:)

注意:Google 确实有一个 Google.Apis.Auth.MVC 包来帮助简化此 OAuth 2.0 流程,但不幸的是,它与特定的 MVC 实现耦合,不适用于 ASP.NET Core或 Web API.所以,我不会使用它.我将给出的示例适用于所有 ASP.NET 应用程序.相同的代码流可用于您启用的任何 Google API,因为它取决于您请求的范围.

另外,我假设您已在 Google 开发者仪表板中设置了您的应用程序.也就是说,您已经创建了一个应用程序,启用了必要的 YouTube API,创建了一个 Web 应用程序客户端,并正确设置了您允许的重定向 url.

流程将像这样工作:

  1. 用户点击按钮(例如添加 YouTube)
  2. View调用Controller上的方法获取授权URL
  3. 在控制器方法中,我们要求 Google 根据我们的客户端凭据(在 Google Developer Dashboard 中创建的凭据)向我们提供授权 URL,并向 Google 提供我们应用程序的重定向 URL(此重定向 URL 必须在您的您的 Google 应用程序接受的重定向 URL 列表)
  4. Google 将授权 URL 返还给我们
  5. 我们将用户重定向到该授权 URL
  6. 用户授予我们的应用访问权限
  7. Google 使用我们根据请求提供给 Google 的重定向 URL 向我们的应用程序返回一个特殊的访问代码
  8. 我们使用该访问代码为用户获取 Oauth 令牌
  9. 我们为用户保存 Oauth 令牌

您需要以下 NuGet 包

  1. Google.Apis
  2. Google.Apis.Auth
  3. Google.Apis.Core
  4. Google.apis.YouTube.v3

模型

公共类 ExampleModel{公共布尔 UserHasYoutubeToken { 获取;放;}}

控制者

公共类 ExampleController : 控制器{//我假设您有某种服务可以从您的数据库中读取用户并将用户更新到您的数据库私有 IUserService 用户服务;公共示例控制器(IUserService 用户服务){this.userService = 用户服务;}公共异步任务<IActionResult>指数(){var userId =//获取你的用户 ID//我假设你有办法知道用户是否有 YouTube 的访问令牌var userHasToken = this.userService.UserHasYoutubeToken(userId);var 模型 = 新 ExampleModel { UserHasYoutubeToken = userHasToken }返回视图(模型);}//这是我们将用来获取授权码流的方法私有 AuthorizationCodeFlow GetGoogleAuthorizationCodeFlow(参数字符串 [] 范围){var clientIdPath = @"C:PathToMyclient_id.json";使用 (var fileStream = new FileStream(clientIdPath, FileMode.Open, FileAccess.Read)){var clientSecrets = GoogleClientSecrets.Load(stream).Secrets;var initializer = new GoogleAuthorizationCodeFlow.Initializer { ClientSecrets = clientSecrets, Scopes = scopes };var googleAuthorizationCodeFlow = new GoogleAuthorizationCodeFlow(initializer);返回 googleAuthorizationCodeFlow;}}//这是您的视图将调用的路由(我们将使用 JQuery 调用它)[HttpPost]公共异步任务<字符串>GetAuthorizationUrl(){//首先,我们需要构建一个重定向 URL,在用户授予访问权限后,Google 将使用该 URL 重定向回应用程序var 协议 = Request.IsHttps ?https":http";var redirectUrl = $"{protocol}://{Request.Host}/{Url.Action(nameof(this.GetYoutubeAuthenticationToken)).TrimStart('/')}";//接下来,让我们定义我们将要访问的范围.我们正在请求 YouTubeForceSsl,以便我们可以管理用户的 YouTube 帐户.var scopes = new[] { YouTubeService.Scope.YoutubeForceSsl };//现在,让我们获取 AuthorizationCodeFlow,它将生成一个唯一的授权 URL 以将我们的用户重定向到var googleAuthorizationCodeFlow = this.GetGoogleAuthorizationCodeFlow(scopes);var codeRequestUrl = googleAuthorizationCodeFlow.CreateAuthorizationCodeRequest(redirectUrl);codeRequestUrl.ResponseType = "代码";//构建网址var authorizationUrl = codeRequestUrl.Build();//将其返回给我们的调用者进行重定向返回授权网址;}公共异步任务<IActionResult>GetYoutubeAuthenticationToken([FromQuery] 字符串代码){如果(字符串.IsNullOrEmpty(代码)){/*这意味着用户取消了并且没有授予我们访问权限.在这种情况下,会有一个查询参数在名为错误"的请求 URL 上,该 URL 将包含错误消息.但是,您可以处理这种情况.在这里,我们不会做任何事情,但是您应该编写代码来处理这种情况,但是您的应用程序需要.*

本文标题为:Google 数据 API 授权重定向 URI 不匹配

基础教程推荐