Итак, мой вопрос: как открыть URL авторизации, не открывая браузер? Я хочу, чтобы мой код автоматически авторизовался, не делая этого вручную.
blockquote>Если вы используете G Suite, вы можете создать учетную запись службы и активировать делегирование в рамках всего домена для принятия личности пользователя G Suite. Это работает только для пользователей, которые являются частью вашего домена G Suite.
Если вы не используете G Suite, вы не сможете обойти экран аутентификации пользователя при первом входе пользователя на ваш сайт. Как только пользователь аутентифицируется с доступом
offline
, вы можете сохранить токен обновления для использования в будущем.Аутентификация и авторизация происходит между клиентом (пользователем) и аккаунтами Google. Ваше программное обеспечение не участвует в части учетных данных (имя пользователя, пароль и т. Д.). Пользователь должен предоставить разрешение на использование учетных записей Google, чтобы ваши службы могли получить доступ к идентификационной информации Google.
[EDIT 1/22/2019 - после вопроса о том, как сохранить токен обновления]
Следующий код с авторизацией и сохранением токена обновления:
# pip install google-auth-oauthlib from google_auth_oauthlib.flow import InstalledAppFlow # https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html flow = InstalledAppFlow.from_client_secrets_file( 'client_secrets.json', scopes=['https://www.googleapis.com/auth/cloud-platform']) cred = flow.run_local_server( host='localhost', port=8088, authorization_prompt_message='Please visit this URL: {url}', success_message='The auth flow is complete; you may close this window.', open_browser=True) with open('refresh.token', 'w+') as f: f.write(cred._refresh_token) print('Refresh Token:', cred._refresh_token) print('Saved Refresh Token to file: refresh.token')
У Вас есть ссылка на неизменную строку. Присвоение не должно копировать значение (строковые данные), так как это неизменно. Если Вы делаете изменяемую операцию, как значение = [newValue uppercaseString] затем она должна скопировать биты в значение, и значение сохраняет увеличенное количество.
Не смотрите на, сохраняют количества. Они не полезны и только введут в заблуждение Вас — Вы не можете быть уверены, что ничто иное не сохраняет объект, что объект, от которого Вы добираетесь где-нибудь, не совместно используется.
Вместо этого сконцентрируйтесь на монопольном использовании объекта и следуйте правилам управления памятью Какао к букве. Тем путем Ваше управление памятью будет корректно независимо от того, что Какао оптимизации может делать негласно для Вас. (Например, реализовывая -copy
как просто -retain
для неизменных объектов.)
Кроме того, очень важно понять различие между свойствами Ваших объектов и переменных экземпляра в Ваших объектах. В коде Вашего вопроса Вы присваиваете значение переменной экземпляра. Та переменная экземпляра просто что: переменная. Присвоение ему будет вести себя как любое другое переменное присвоение. Для использования свойства необходимо использовать или точечный синтаксис или синтаксис скобки для фактического вызова метода установщика свойства:
self.value = newValue; // this is exactly equivalent to the next line
[self setValue:newValue]; // this is exactly equivalent to the previous line
Код, сгенерированный для точечного синтаксиса и синтаксиса скобки, идентичен, и ни один не получит доступ к переменной экземпляра непосредственно.
Вы являетесь передающими в литеральной строке. Компилятор, вероятно, выделяет его в статическом ЗУ и устанавливает сохранить количество на максимальное возможное значение.
Попробуйте динамично выделенную строку вместо этого и посмотрите то, что происходит.
NSString* string = [[NSString alloc] initWithString: @"some text"];
Test* test = [[Test alloc] initWithValue: string];
Вы являетесь передающими в строковой константе, которая не может действительно быть освобождена. Я думаю, что 2147483647, вероятно, UINT_MAX, который в основном означает, что объект не может быть выпущен.
Я думаю, что Вы хотите сделать это:
self.value = newValue;
который вызовет метод set свойства и заставит копию происходить. "значение = newValue" просто присваивает значение указателя переменной экземпляра.
Вы не должны быть уделением внимания сохранить количествам, просто следовать правилам управления памятью Какао. http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html
хм.. мы становимся ближе.
кажется, что newValue's сохраняет количество, также 2147483647.
Я пытался динамично выделить строку вместо этого с тем же, сохраняют результаты подсчета.
Я нашел полезную статью здесь: http://www.cocoadev.com/index.pl?NSString
FTA:
NSString, возвращенный"", должен быть выпущен, или он автовыпущен? Ни один. "" - строки имеют класс NSConstantString?, и таким образом действуйте как атомы в шепелявости; они бродят вокруг. Таким образом, если Вы будете использовать "корова" в двух отдельных местах в Вашем коде, то они будут ссылаться на тот же самый объект. Я не думаю - выпуск или-autorelease делают что-либо любому из них.
Если у меня есть "копия" на свойстве, хотя, разве это не должно копировать содержание целевой памяти в новую память с сохранить количеством 1? Казалось бы, что атрибут копии ничего не делает в этом случае?
В Какао многие неизменяемые объекты просто сохранят себя, когда вы запросите копию в той же зоне. Если гарантируется, что объект не изменится (то есть его неизменность), то точный дубликат является избыточным.
В Objective-C класс константной строки отделен от класса NSString
Какао, хотя он может быть подкласс NSString
(я не совсем уверен). Этот класс константной строки может переопределять методы NSObject
, такие как keep
, release
и dealloc
, чтобы они ничего не делали, а также переопределяли keepCount
, чтобы он всегда возвращал одно и то же число, UINT_MAX
или около того. Это связано с тем, что постоянная строка Objective-C создается в статической памяти.
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
char *cstr = "this is a c string";
NSString *str = [[NSString alloc] initWithUTF8String:cstr];
NSLog(@"rc1: %d", [str retainCount]);
[pool drain];
return 0;
}
Если вы запустите приведенный выше код, он отобразит счетчик сохраненных данных, равный 1