Как получить доступ к электронной почте пользователя после звонка gapi.auth2.authorize
Мы разрешаем пользователям дополнительно проходить аутентификацию в нашем приложении, используя свои учетные данные Google через oauth. Это работает нормально, однако Google прекращает вызов Google + API, который мы используем, чтобы получить их адрес электронной почты, который будет проблемой для нас. К сожалению, я постарался найти правильный подход для получения электронной почты, поэтому любые предложения будут оценены.
Вот текущий код: var developerKey = 'наш ключ'; var clientId = 'наш идентификатор'; var scope = ['email']; var oauthToken;
// authorize the current user with Google
function authorizeGoogleUser() {
gapi.auth2.authorize({
'client_id': clientId,
'scope': scope,
'immediate': false
},
handleAuthorizeCallback);
}
// handle callback from the authorization, doing the user lookup if valid
function handleAuthorizeCallback(authResult) {
if (authResult && !authResult.error) {
//save the token and do the user lookup
oauthToken = authResult.access_token;
getGoogleUserDetails();
}
}
// lookup user details, prompting for authentication/permission if needed
function getGoogleUserDetails() {
if (oauthToken == null) {
//authenticate
gapi.load('auth2', { 'callback': authorizeGoogleUser });
}
else {
//already athenticated, so continue to do user lookup
gapi.client.load('plus', 'v1', apiClientLoaded);
}
}
function apiClientLoaded() {
//
// THIS IS THE PORTION THAT NEEDS REDESIGNED AS THIS CALL IS GOING AWAY
//
gapi.client.plus.people.get({ userId: 'me' }).execute(handleGetUserResponse);
}
//do user lookup
function handleGetUserResponse(resp) {
if (resp && resp.emails.length > 0) {
//get primary email address
var primaryEmail;
for (var i = 0; i < resp.emails.length; i++) {
if (resp.emails[i].type === 'account') primaryEmail = resp.emails[i].value;
}
//call server-side method to encrypt email and refresh page
$.ajax({
type: "POST",
url: "OUR URL",
data: "{'emailAddress': '" + primaryEmail + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (retVal) {
if (retVal.d !== '') {
window.location.href = retVal.d;
}
}
});
}
}
1 ответ
Я переписал весь процесс, теперь он работает для всех браузеров, кроме IE. Будем благодарны за любые предложения относительно IE. К сожалению, IE на самом деле не выдает ошибку, он выполняет аутентификацию, но никогда не возвращается к слушателю.
<script type="text/javascript" src="https://apis.google.com/js/api.js" "></script>
<script type="text/javascript">
var apiKey = 'our key;
var discoveryDocs = ["https://people.googleapis.com/$discovery/rest?version=v1"];
var clientId = 'our client id;
var scopes = 'profile';
function handleClientLoad() {
// Load the API client and auth2 library
gapi.load('client:auth2', initClient);
}
function initClient() {
gapi.client.init({
apiKey: apiKey,
discoveryDocs: discoveryDocs,
clientId: clientId,
scope: scopes,
'immediate': false
}).then(function () {
// Listen for sign-in state changes.
gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);
});
}
function updateSigninStatus(isSignedIn) {
if (isSignedIn) {
makeApiCall();
}
}
function handleAuthClick() {
// here is my current issue, need to see if the user is signed in or not
var isSignedIn = gapi.auth2.getAuthInstance().isSignedIn.get();
if (isSignedIn) {
makeApiCall();
}
else {
gapi.auth2.getAuthInstance().signIn();
}
}
function makeApiCall() {
// Load the API and make an API call. Display the results on the screen.
gapi.client.people.people.get({
'resourceName': 'people/me',
'requestMask.includeField': 'person.emailAddresses'
}).then(function(resp) {
var email = resp.result.emailAddresses[0].value;
//call server-side method to encrypt email and refresh page
$.ajax({
type: "POST",
url: "our url",
data: "{'emailAddress': '" + email + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (retVal) {
if (retVal.d !== '') {
window.location.href = retVal.d;
}
}
});
});
}
</script>
<script type="text/javascript" async defer src="https://apis.google.com/js/api.js"
onload="this.onload=function(){};handleClientLoad()"
onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>
<asp:linkButton ID = "btnGoogle" runat="server" CssClass="LinkBtn BtnContainerVertical" Width="200px" CausesValidation="false" OnClientClick="handleAuthClick(); return false;" ><img src="../Images/google.png" class="LinkBtnIcon" style="height:20px" />Google Login</asp:linkButton>