c# – ASP.Net MVC5,Google OAuth 2.0和Youtube API
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – ASP.Net MVC5,Google OAuth 2.0和Youtube API,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7078字,纯文字阅读大概需要11分钟。
内容图文
![c# – ASP.Net MVC5,Google OAuth 2.0和Youtube API](/upload/InfoBanner/zyjiaocheng/786/be6c143b06c64e8795935d3a688e8a3c.jpg)
我需要一些关于mvc 5的帮助,使用谷歌登录提供商并获取一些youtube数据.现在我觉得我的事情有些混乱.我不是mvc的新手,而是版本5的中间件功能.好吧,没有实施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时,我将我重定向到谷歌,要求我的凭据.
输入时,我被问到我是否对应用程序要求的权限感到满意.确认后,我被重定向到我的页面,显示带有请求数据的/ Youtube / IndexAsync页面.到目前为止这么好,但那不是我想要的.
(我认为)我在这里完成的是我完全绕过了asp.net身份系统.用户未登录到我的应用程序,更不用说已注册.
我希望用户使用谷歌登录,在我的应用程序中注册并提供对他的YouTube数据的访问权限.然后,在特定页面上,从用户的youtube帐户中检索数据.
我也尝试过:
>本教程未提及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);
上面的代码做了两件事:
>通过启用身份验证.谷歌
>请求访问令牌和刷新令牌.然后将令牌添加为GooglePlus中间件中的声明.
创建一个方法,将包含令牌的声明存储到数据库.我在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中的两个位置调用它:一次在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);
}
}
现在我们已经获得了用户访问令牌和刷新令牌,我们可以使用它来验证用户身份.
我尝试了一个简单的搜索,我在示例中看到并且它有效:
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;
}
}
内容总结
以上是互联网集市为您收集整理的c# – ASP.Net MVC5,Google OAuth 2.0和Youtube API全部内容,希望文章能够帮你解决c# – ASP.Net MVC5,Google OAuth 2.0和Youtube API所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。