Я вызываю следующий код на своем бэкэнде, когда пользователь хочет получить доступ к своему диску Google через мой сервис.
public static DriveService GetService(string app_userID)
{
//get Credentials from client_secret.json file
UserCredential credential;
var path = HttpContext.Current.Server.MapPath(@"~/client_secret.json");
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
// The file token.json stores the user's access and refresh tokens, and is created
// automatically when the authorization flow completes for the first time.
string credPath = HttpContext.Current.Server.MapPath(@"~/token.json");
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
Scopes,
app_userID,
CancellationToken.None,
new FileDataStore(credPath, true)).Result;
}
//create Drive API service.
DriveService service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "GoogleDriveRestAPI-v3",
});
return service;
Проблема, однако, в том, что я думаю, что этот код разработан для запуска во внешнем приложении. Я получаю следующую ошибку, и я думаю, что программа пытается открыть веб-страницу для аутентификации, но на внутреннем сервере.
{
"Message": "An error has occurred.",
"ExceptionMessage": "One or more errors occurred.",
"ExceptionType": "System.AggregateException",
"StackTrace": " at System.Threading.Tasks.Task`1.GetResultCore(Boolean .......GoogleDrive.GoogleDriveFilesRepository.GetService(String tt_userID) in ,,,
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Failed to launch browser with \"...(google url)..." for authorization. See inner exception for details.",
"ExceptionType": "System.NotSupportedException",
"StackTrace": " ...
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Access is denied",
"ExceptionType": "System.ComponentModel.Win32Exception",
"StackTrace": " at ...
Как я могу изменить, чтобы конечный пользователь проходил аутентификацию на стороне клиента? См. Мое устройство ниже.
Обратите внимание, что я все еще хотел бы иметь возможность вызывать API из серверной части, если это возможно.