好的,我正在使用Google API并使用OAuth2。我需要使用自己的多个API调用,使用Classroom API执行不同的操作。我见过的所有C#示例都会让用户验证他们使用谷歌服务。
我需要进行一次身份验证,并将该访问令牌发送到API以进行其他调用。
我的最终目标是这样的:
我可以使用Postman或我自己的网络应用程序轻松获取访问令牌。
当我在授权标题中发送它时(邮差将其作为承载发送)我不知道该怎么做它。
我解析它吗? .Net Google API库中有什么东西可以让它变得简单吗?
似乎这应该是一个常见的场景,但我找不到任何关于此的教程或指南。
谢谢!
答案 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;
}
}