C#Web API - 在后续调用中使用OAuth进行身份验证

时间:2018-03-13 23:44:17

标签: c# asp.net-web-api oauth-2.0 google-api google-oauth

好的,我正在使用Google API并使用OAuth2。我需要使用自己的多个API调用,使用Classroom API执行不同的操作。我见过的所有C#示例都会让用户验证他们使用谷歌服务。

我需要进行一次身份验证,并将该访问令牌发送到API以进行其他调用。

我的最终目标是这样的:

  • 用户使用google登录..他们会返回访问令牌等
  • 将该令牌传递到授权标头
  • API接受并提取凭据并将其传递给Google服务(是我被困的地方)

我可以使用Postman或我自己的网络应用程序轻松获取访问令牌。

当我在授权标题中发送它时(邮差将其作为承载发送)我不知道该怎么做它。

我解析它吗? .Net Google API库中有什么东西可以让它变得简单吗?

似乎这应该是一个常见的场景,但我找不到任何关于此的教程或指南。

谢谢!

1 个答案:

答案 0 :(得分:0)

好的......最后,我解决了这个问题(在这个问题的帮助下)。

How to create a instance of UserCredential if I already have the value of Access Token?

首先,我得到谷歌oauth好吃的东西。

    public async Task<UserCredential> GetUserCredential()
    {
        try
        {
            UserCredential credential;

            credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                       new ClientSecrets
                       {
                           ClientId = ConfigurationManager.AppSettings["GoogleClassroomClientID"],
                           ClientSecret = ConfigurationManager.AppSettings["GoogleClassroomSecret"]
                       }, _scopes, "user", CancellationToken.None, new FileDataStore("Web.Google.Classroom.Api.Store"));

            return credential;
        }
        catch (Exception ex)
        {
            HandleError(ex);
            return null;
        }
    }

从这里我解析出Access Token和Refresh Token。

然后我在所有后续API调用中将这两个作为标题发送。

在我的API调用中,我使用身份验证和刷新令牌来获取触摸任何Google API(在我的情况下是教室API)所需的UserCredential对象。神奇之处在于我的AuthorizeGoogleUser功能。

我所有的电话都是通过SSL进行的,所以我很确定这种方法没有任何安全问题,但我完全支持你所做的任何改进。

    static string[] _scopes = { ClassroomService.Scope.ClassroomCoursesReadonly };
    static string _applicationName = "DiBS Google Classroom API";

    private static readonly IAuthorizationCodeFlow flow =
        new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
        {
            ClientSecrets = new ClientSecrets
            {
                ClientId = ConfigurationManager.AppSettings["GoogleClassroomClientID"],
                ClientSecret = ConfigurationManager.AppSettings["GoogleClassroomSecret"]
            },
            Scopes = _scopes
        });


    [Route("google/getcourses")]
    [HttpGet] 
    public void GetCourses()
    {
        try
        {
            LogInfo($"Google GetCourses: Start");

            UserCredential creds = AuthorizeGoogleUser();
            if (creds == null)
                throw new Exception("Invalid Google User");

            // Create Classroom API service.
            var service = new ClassroomService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = creds,
                ApplicationName = _applicationName,
            });

            // Define request parameters.
            CoursesResource.ListRequest request = service.Courses.List();
            request.PageSize = 10;

            // List courses.
            ListCoursesResponse response = request.Execute();
            if (response.Courses != null && response.Courses.Count > 0)
            {
                foreach (var course in response.Courses)
                {
                    LogInfo($"Google GetCourses: {course.Name}, {course.Id}");
                }
            }
            else
            {
                LogInfo("Google GetCourses: No courses found.");
            }
        }
        catch (Exception ex)
        {
            HandleError(null, ex);
        }
    }

    private UserCredential AuthorizeGoogleUser()
    {
        try
        {
            string GAT = HttpContext.Current.Request.Headers["GAT"];
            string GRT = HttpContext.Current.Request.Headers["GRT"];

            if (GAT == null || GRT == null)
                return null;

            var token = new TokenResponse
            {
                AccessToken = GAT,
                RefreshToken = GRT
            };

            var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
            {
                ClientSecrets = new ClientSecrets
                {
                    ClientId = ConfigurationManager.AppSettings["GoogleClassroomClientID"],
                    ClientSecret = ConfigurationManager.AppSettings["GoogleClassroomSecret"]
                },
                Scopes = _scopes,
                DataStore = new FileDataStore("DiBS-Web.Google.Classroom.Api.Store")
            });

            UserCredential credential = new UserCredential(flow, "me", token);
            return credential;
        }
        catch
        {
            return null;
        }
    }