gpt4 book ai didi

c# - ASP.Net MVC5、Google OAuth 2.0 和 Youtube API

转载 作者:太空狗 更新时间:2023-10-30 01:35:36 26 4
gpt4 key购买 nike

我需要一些有关使用 google 登录提供程序的 mvc 5 和获取一些 youtube 数据的帮助。现在我想我把事情弄混了。我不是 mvc 的新手,而是版本 5 的 owin 中间件功能。嗯,没有实现 oauth 2.0 的经验。

我想要什么:

  • 通过 Google 登录到我的 MVC5 应用程序。
  • 从登录用户那里读取一些 Youtube 信息。

到目前为止我做了什么:

  • 学习了这个 Google OAuth 2.0 教程:Web applications (ASP.NET MVC) .
    • 通过 NuGet 安装了 Google.Apis.Auth.MVC。
    • 按照说明实现 AppFlowMetadata 和 AuthCallbackController。
    • 按照说明将重定向 uri 配置为“/AuthCallback/IndexAsync”。
  • 使用以下操作实现了一个 YoutubeController 只是为了转储一些数据:

    public async Task<ActionResult> IndexAsync()
    {
    var result =
    await new AuthorizationCodeMvcApp(this, new AppFlowMetadata())
    .AuthorizeAsync(cancellationToken);

    if (result.Credential == null)
    {
    return new RedirectResult(result.RedirectUri);
    }
    else
    {
    var service = new YouTubeService(new BaseClientService.Initializer
    {
    HttpClientInitializer = result.Credential,
    ApplicationName = "MyYoutubeApplication"
    });

    var playlists = service.Playlists.List("contentDetails, snippet");
    playlists.Mine = true;

    var list = await playlists.ExecuteAsync();
    var json = new JavaScriptSerializer().Serialize(list);

    ViewBag.Message = json;
    return View();
    }
    }

那么,当尝试访问 /Youtube/IndexAsync 时,它的作用是将我重定向到 google,询问我的凭据。输入时,系统会询问我是否同意应用程序要求的许可。确认后,我被重定向到我的页面,显示我的 /Youtube/IndexAsync 页面和请求的数据。到目前为止还不错,但这不是我想要的。

我在这里所做的(我认为)是我完全绕过了 asp.net 身份系统。用户没有登录到我的应用程序,更不用说注册了。

我希望用户使用谷歌登录,在我的应用程序中注册并提供对他的 YouTube 数据的访问权限。然后,在特定页面上时,从用户的 YouTube 帐户检索数据。

我也尝试过:

  • 关注此ASP.Net MVC5 Tutorial
    • 本教程没有提及 NuGet 包“Google.Apis.Auth.MVC”,而是讨论了一些关于神奇的“/signin-google”重定向 uri 的内容。
    • 这也有效,但打破了上面的解决方案,提示错误的重定向 uri。
    • 当使用这种方法时,我似乎不适合再次调用 YoutubeController 中的 AuthorizeAsync,因为我应该已经获得授权。

所以我在黑暗中寻找一些光,告诉我我在混合什么 :) 我希望这个问题不像我现在一样困惑。

最佳答案

我设法使用 GooglePlus 做到了这一点,还没有尝试过谷歌。这是我所做的:

安装 nugets:

> Install-Package Owin.Security.Providers
> Install-Package Google.Apis.Youtube.v3

将此添加到 Startup.auth.cs:

var g = new GooglePlusAuthenticationOptions();
g.ClientId = Constants.GoogleClientId;
g.ClientSecret = Constants.GoogleClientSecret;
g.RequestOfflineAccess = true; // for refresh token
g.Provider = new GooglePlusAuthenticationProvider
{
OnAuthenticated = context =>
{
context.Identity.AddClaim(new Claim(Constants.GoogleAccessToken, context.AccessToken));
if (!String.IsNullOrEmpty(context.RefreshToken))
{
context.Identity.AddClaim(new Claim(Constants.GoogleRefreshToken, context.RefreshToken));
}
return Task.FromResult<object>(null);
}
};

g.Scope.Add(Google.Apis.YouTube.v3.YouTubeService.Scope.YoutubeReadonly);
g.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie;
app.UseGooglePlusAuthentication(g);

上面的代码做了两件事:

  1. 启用身份验证。谷歌+
  2. 请求访问 token 和刷新 token 。然后将 token 作为声明添加到 GooglePlus 中间件中。

创建一个方法,将包含 token 的声明存储到数据库中。我在 AccountController.cs 文件中有这个

private async Task StoreGooglePlusAuthToken(ApplicationUser user)
{
var claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
if (claimsIdentity != null)
{
// Retrieve the existing claims for the user and add the google plus access token
var currentClaims = await UserManager.GetClaimsAsync(user.Id);
var ci = claimsIdentity.FindAll(Constants.GoogleAccessToken);
if (ci != null && ci.Count() != 0)
{
var accessToken = ci.First();
if (currentClaims.Count() <= 0)
{
await UserManager.AddClaimAsync(user.Id, accessToken);
}
}

ci = claimsIdentity.FindAll(Constants.GoogleRefreshToken);
if (ci != null && ci.Count() != 0)
{
var refreshToken = ci.First();
if (currentClaims.Count() <= 1)
{
await UserManager.AddClaimAsync(user.Id, refreshToken);
}
}
}

您需要在 AccountController.cs 中的 2 个地方调用它:一次在 ExternalLoginCallback 中:

case SignInStatus.Success:
var currentUser = await UserManager.FindAsync(loginInfo.Login);
if (currentUser != null)
{
await StoreGooglePlusAuthToken(currentUser);
}
return RedirectToLocal(returnUrl);

一旦在 ExternalLoginConfirmation 中:

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (result.Succeeded)
{
await StoreGooglePlusAuthToken(user);
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToLocal(returnUrl);
}
}

现在我们已经获得了用户访问 token 和刷新 token ,我们可以使用它来对用户进行身份验证。

我尝试了一个我在示例中看到的简单搜索,它起作用了:

private async Task<Models.YouTubeViewModel> Search(string searchTerm)
{
var user = (ClaimsPrincipal)Thread.CurrentPrincipal;

var at = user.Claims.FirstOrDefault(x => x.Type == Constants.GoogleAccessToken);
var rt = user.Claims.FirstOrDefault(x => x.Type == Constants.GoogleRefreshToken);

if (at == null || rt == null)
throw new HttpUnhandledException("Access / Refresh Token missing");

TokenResponse token = new TokenResponse
{
AccessToken = at.Value,
RefreshToken = rt.Value
};

var cred = new UserCredential(new GoogleAuthorizationCodeFlow(
new GoogleAuthorizationCodeFlow.Initializer()
{
ClientSecrets = new ClientSecrets()
{
ClientId = Constants.GoogleClientId,
ClientSecret = Constants.GoogleClientSecret
}
}
),
User.Identity.GetApplicationUser().UserName,
token
);

var youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
ApplicationName = this.GetType().ToString(),
HttpClientInitializer = cred,
});

var searchListRequest = youtubeService.Search.List("snippet");
searchListRequest.Q = searchTerm;
searchListRequest.MaxResults = 50;

// Call the search.list method to retrieve results matching the specified query term.
var searchListResponse = await searchListRequest.ExecuteAsync();

Models.YouTubeViewModel vm = new Models.YouTubeViewModel(searchTerm);
foreach (var searchResult in searchListResponse.Items)
{
switch (searchResult.Id.Kind)
{
case "youtube#video":
vm.Videos.Add(new Models.Result(searchResult.Snippet.Title, searchResult.Id.VideoId));
break;

case "youtube#channel":
vm.Channels.Add(new Models.Result(searchResult.Snippet.Title, searchResult.Id.ChannelId));
break;

case "youtube#playlist":
vm.Playlists.Add(new Models.Result(searchResult.Snippet.Title, searchResult.Id.PlaylistId));
break;
}
}

return vm;
}

模型类

public class Result 
{
public string Title { get; set; }
public string Id { get; set; }

public Result() { }

public Result(string title, string id)
{
this.Title = title;
this.Id = id;
}
}

public class YouTubeViewModel
{
public string SearchTerm { get; set; }

public List<Result> Videos { get; set; }
public List<Result> Playlists { get; set; }
public List<Result> Channels { get; set; }

public YouTubeViewModel()
{
Videos = new List<Result>();
Playlists = new List<Result>();
Channels = new List<Result>();
}

public YouTubeViewModel(string searchTerm)
:this()
{
SearchTerm = searchTerm;
}
}

引用:http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social-providers-used-in-the-vs-2013-project-templates.aspx

关于c# - ASP.Net MVC5、Google OAuth 2.0 和 Youtube API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25275275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com