2014-07-23 3 views
2

Я успешно настроил MVC 5 с OAuth Google на стороне сервера. Тем не менее, я также хочу выполнить javascript с токеном пользователя auth, и я не хочу заставлять их повторно проверять эту функцию.ASP.NET MVC - получить токен OAuth Google

Как я могу сохранить токен пользователя OAuth для использования при использовании API-интерфейса клиента OAuth?

В частности - я хочу загрузить зарегистрированные подписи пользователя в YouTube. This page содержит информацию о том, как использовать серверный и клиентский API, но мне трудно найти, где в обратном вызове сервера присутствует токен. Я просмотрел в ExternalLoginCallback метод моего AccountController для любой информации, но я не могу понять, какие данные содержат токен. Если я могу найти его на объектах на стороне сервера, я могу разоблачить их для представления с помощью javascript-вызовов, но я не могу найти, где этот токен.

ответ

0

В протоколе OAuth, запросы приложения авторизации доступа к ресурсам, которые идентифицируются областей, и предполагая, что пользователь прошел проверку подлинности и утверждает, ваше приложение получает короткоживущие маркеры доступа, которые позволяют ей получить доступ к этим ресурсам, и (необязательно) обновлять токены, чтобы обеспечить долгосрочный доступ.

В вашем случае вам нужно будет хранить токен доступа, предоставленный при одобрении пользователем доступа к своим ресурсам YouTube. Обычный токен предлагает только один час доступа, а также записывать токен обновления, чтобы включить более длительные сеансы. Добавьте сторону маркерного сервера в заголовок http и получите свой javascript на стороне клиента, чтобы использовать это, чтобы получить аутентифицированный доступ к google apis.

Примеры и основы о том, как реализовать можно копировать много материала с сайтов Google, но думаю, что вам лучше читать:

  1. инкрементный разрешение на Using OAuth 2.0 for Web Server Applications

  2. автономного доступа на той же странице, что и выше, для использования токенов обновления

  3. OAuth 2.0 Обзор и помощь Google APIs Client Library for .NET

Я пытаюсь построить базу прямо сейчас, что помогает мне сохранять и извлекать результаты аутентификации диспетчера Google для своих пользователей и нашел информацию выше и ссылки содержащихся в них действительно полезны, надеюсь, они вам тоже помогут.

+0

Я понимаю, что мне нужно хранить маркер, у меня возникают проблемы _finding_ самих маркеров в объекты, которые у меня есть на стороне сервера. – DLeh

7

Вы можете настроить GoogleOAuth2AuthenticationOptions в файле MVC5 Startup.Auth.cs, чтобы запросить токены доступа и обновления для использования с OAuth2 api Google.

В этом примере я собираю значения, переданные от google, к промежуточному программному обеспечению OWIN OAuth2 и добавляя их к утверждениям, доступным в вашем методе обратного вызова.

var googleCreds = new GoogleOAuth2AuthenticationOptions 
     { 
      ClientId = "[replace with your google console issued client id]", 
      ClientSecret = "[replace with your google console issued client secret]", 

      Provider = new Microsoft.Owin.Security.Google.GoogleOAuth2AuthenticationProvider 
      { 
       OnApplyRedirect = context => 
       { 


        string redirect = context.RedirectUri; 
        redirect += "&access_type=offline"; 
        redirect += "&approval_prompt=force"; 
        redirect += "&include_granted_scopes=true"; 


        context.Response.Redirect(redirect); 

       }, 
       OnAuthenticated = context => 
       { 
        TimeSpan expiryDuration = context.ExpiresIn ?? new TimeSpan(); 
        context.Identity.AddClaim(new Claim("urn:tokens:google:email", context.Email)); 
        context.Identity.AddClaim(new Claim("urn:tokens:google:url", context.GivenName)); 
        if (!String.IsNullOrEmpty(context.RefreshToken)) 
        { 
         context.Identity.AddClaim(new Claim("urn:tokens:google:refreshtoken", context.RefreshToken)); 
        } 
        context.Identity.AddClaim(new Claim("urn:tokens:google:accesstoken", context.AccessToken)); 
        if (context.User.GetValue("hd") != null) 
        { 

         context.Identity.AddClaim(new Claim("urn:tokens:google:hd", context.User.GetValue("hd").ToString())); 
        } 
        context.Identity.AddClaim(new Claim("urn:tokens:google:accesstokenexpiry", DateTime.UtcNow.Add(expiryDuration).ToString())); 

        return System.Threading.Tasks.Task.FromResult<object>(null); 
       } 
      } 
     }; 
     googleCreds.Scope.Add("openid"); 
     googleCreds.Scope.Add("email"); 

     app.UseGoogleAuthentication(googleCreds); 

Теперь вы можете получить доступ к этим значениям требований из своего метода обратного вызова. Например:

var loginInfo = AuthenticationManager.GetExternalLoginInfo(); 
string GoogleAccessCode = String.Empty; 
if (loginInfo.ExternalIdentity.Claims.FirstOrDefault(c => c.Type.Equals("urn:tokens:google:accesstoken")) != null) 
        { 
         GoogleAccessCode = loginInfo.ExternalIdentity.Claims.FirstOrDefault(c => c.Type.Equals("urn:tokens:google:accesstoken")).toString(); 
       } 

В начале последовательности аутентификации или после того, как вы закончили работу с AuthenticationManager.GetExternalLoginInfo(), вы можете очистить внешние кук аутентификации, который плавает вокруг, чтобы предотвратить любое проблемное строительство дублирующего печенья до:

if (Request.Cookies[".AspNet.ExternalCookie"] != null) 
      { 
       var c = new System.Web.HttpCookie(".AspNet.ExternalCookie"); 
       c.Expires = DateTime.Now.AddDays(-1); 
       Response.Cookies.Add(c); 
      } 
+0

Спасибо! Я попробую это сегодня вечером. – DLeh

+0

это меня намного ближе к ответу, но иногда 'AuthenticationManager.GetExternalLoginInfo();' просто возвращает null, даже после того, как я прошел аутентификацию. Есть идеи? – DLeh

+1

Как работает, поставщик промежуточного программного обеспечения устанавливает куки-файл под названием «.AspNet.ExternalCookie», а затем перенаправляет ваш метод обратного вызова. Если cookie установлен, выполняется запрос AuthenticationManager.GetExternalLoginInfo. Иногда, если вы тестировали последовательность несколько раз, есть несколько экземпляров файла cookie, что вызывает проблему. Моя текущая практика заключается в очистке любого файла cookie под названием «.AspNet.ExternalCookie», либо перед запуском первой последовательности ChallengeResult, либо после получения обратного вызова. – timk

Смежные вопросы