Использование API Google JS для добавления контакта, но оно никогда не отключается и не выходит из системы.
В результате многих поисков я получил нужный сценарий для работы, как и ожидалось. Если пользователь нажимает кнопку на моей веб-странице, то в его списке контактов Google будет создан контакт (если он авторизован).
Проблема, с которой я остаюсь, заключается в том, что срок действия разрешения не истекает В этом случае после успешной авторизации пользователь может многократно нажимать кнопку, даже вернуться на страницу позже в другом сеансе, и он никогда не будет запрашивать авторизацию снова.
Возможно, это и есть предполагаемое поведение GoogleAPI, но для моей предполагаемой цели я не ожидаю более одного клика, и я ожидаю, что если пользователь вернется на мою страницу позже, ему будет предложено снова авторизоваться.
Это возможно? Я попробовал следующее...
gapi.auth.signOut();
gapi.auth2.signOut();
gapi.auth2.disconnect();
отзыв токена (см. конец поста)
... безуспешно
Код можно найти здесь: https://jsfiddle.net/brian_hill/chvtmmjr/7/
function addContact(entry) {
var config = {
'client_id': '403037917634-qproaer1g5gcq83c941heo4q07olol23.apps.googleusercontent.com',
'scope': 'https://www.google.com/m8/feeds',
'cookie_policy': 'single_host_origin'
};
gapi.auth.authorize(config, function() {
insert(config, entry);
});
}
function insert(config, entry) {
gapi.client.request({
'method': 'POST',
'path': '/m8/feeds/contacts/default/full/',
'headers': {
'GData-Version': 3.0
},
'body': {
'entry': [entry]
},
'callback': function(data) {
if (data.hasOwnProperty('entry')) {
var msg = "Your Google Contacts have been updated to include ";
window.alert(msg.concat(data.entry.title.$t))
} else {
var msg = "Contact information could not be added for "
window.alert(msg.concat(entry.title.$t))
}
}
});
}
И HTML
<script src="https://apis.google.com/js/platform.js" async defer></script>
<script src="https://apis.google.com/js/client.js"></script>
<body style="background-color:rgba(32, 177, 17, 0.3);">
<p>
The button below will add a contact to your GMail contacts</p>
<div style="width:150px">
<script>
function addJohn() {
var entry = {
"category": [{
"scheme": "http:\/\/schemas.google.com\/g\/2005#kind",
"term": "http:\/\/schemas.google.com\/contact\/2008#contact"
}],
"title": {
"type": "text",
"$t": "John Doe"
},
"content": [{
"type": "text",
"$t": "[Automatically Created]"
}],
"gd$email": [{
"rel": "http:\/\/schemas.google.com\/g\/2005#other",
"address": "john.doe@abcd.com",
"primary": "true"
}],
"gd$postalAddress": [{
"rel": "http:\/\/schemas.google.com\/g\/2005#home",
"$t": "123 Main Street\nOttawa, ON\nCanada"
}],
"gd$phoneNumber": [{
"rel": "http:\/\/schemas.google.com\/g\/2005#home",
"$t": "555.123.4567",
"primary": "true"
}]
};
addContact(entry);
}
function addJane() {
var entry = {
"category": [{
"scheme": "http:\/\/schemas.google.com\/g\/2005#kind",
"term": "http:\/\/schemas.google.com\/contact\/2008#contact"
}],
"title": {
"type": "text",
"$t": "Jane Doe"
},
"content": [{
"type": "text",
"$t": "[Automatically Created]"
}],
"gd$email": [{
"rel": "http:\/\/schemas.google.com\/g\/2005#other",
"address": "jane.doe@abcd.com",
"primary": "true"
}],
"gd$postalAddress": [{
"rel": "http:\/\/schemas.google.com\/g\/2005#home",
"$t": "321 Unknown Street\nOttawa, ON\nCanada"
}],
"gd$phoneNumber": [{
"rel": "http:\/\/schemas.google.com\/g\/2005#home",
"$t": "555.765.4321",
"primary": "true"
}]
};
addContact(entry);
}
</script>
<button onclick="addJohn();">Add Contact - John</button>
<button onclick="addJane();">Add Contact - Jane</button>
</div>
</body>
(Примечание. Из-за особенностей процесса авторизации в GoogleAPI, он не работает через JS Fiddle ни в Chrome, ни в Firefox - я заставил его работать в Microsoft Edge).
Заранее спасибо, Брайан
PS. Добавляю мою попытку использовать опцию 'revoke'. Который все еще не работает (мне все еще не предлагают повторно для авторизации), но также иногда это работает (обновляет адреса), а иногда это не так.
function addContact(entry) {
var config = {
'client_id': '403037917634-qproaer1g5gcq83c941heo4q07olol23.apps.googleusercontent.com',
'scope': 'https://www.google.com/m8/feeds',
'cookie_policy': 'single_host_origin'
};
gapi.auth.authorize(config, function() {
insert(config, entry);
}).then(signOut);
}
function signOut() {
$.ajax({
'type': 'GET',
'url': 'https://accounts.google.com/o/oauth2/revoke?token=' +
gapi.auth.getToken().access_token,
'async': false,
'contentType': "application/json",
'dataType': 'jsonp',
'success': function (nullResponse) {
window.alert('Disconnected');
},
'error': function (e) {
// Handle the error
console.log(e);
}
});
}
function insert(config, entry) {
gapi.client.request({
'method': 'POST',
'path': '/m8/feeds/contacts/default/full/',
'headers': {
'GData-Version': 3.0
},
'body': {
'entry': [entry]
},
'callback': function(data) {
if (data.hasOwnProperty('entry')) {
var msg = "Your Google Contacts have been updated to include ";
window.alert(msg.concat(data.entry.title.$t))
} else {
var msg = "Contact information could not be added for "
window.alert(msg.concat(entry.title.$t))
}
}
});
}
1 ответ
Попробуйте использовать инструкцию Revoke token в OAuth 2.0:
В некоторых случаях пользователь может пожелать отменить доступ, предоставленный приложению. Пользователь может отозвать доступ, зайдя в настройки учетной записи. Приложение также может программно аннулировать предоставленный ему доступ. Программный отзыв важен в случаях, когда пользователь отписывается или удаляет приложение. Другими словами, часть процесса удаления может включать запрос API, чтобы гарантировать удаление разрешений, предоставленных приложению.\
Чтобы программно отозвать токен, ваше приложение отправляет запрос https://accounts.google.com/o/oauth2/revoke
и включает токен в качестве параметра:
curl -H "Content-type:application/x-www-form-urlencoded" \
https://accounts.google.com/o/oauth2/revoke?token={token}