我们允许使用oauth和google进行身份验证。对于绝大多数客户来说,显示的代码可以正常工作。但是对于少数人来说,它失败了。问题与网络无关,因为我可以使用用户学校提供的Google电子邮件帐户来引起问题,然后切换到个人帐户,并且不会发生此问题。如果确实发生了问题,那么整个学校都会发生,这使我相信这与他们的Google帐户中的设置相关,但是似乎没人知道这个问题。帮助!!!
问题出在makeAPICall函数中,对于大多数用户,我们可以在此之后访问电子邮件,但是在问题学校中,电子邮件是未定义的。但是,不会返回任何错误。
<script type="text/javascript" src="https://apis.google.com/js/api.js" "></script>
<script type="text/javascript">
var apiKey = 'MY API KEY';
var discoveryDocs = ["https://people.googleapis.com/$discovery/rest?version=v1"];
var clientId = 'MY 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() {
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.
// for most users this loads the api and allows me to access the email address.
// for certain schools the email addresss is not returned causing lots of problems
gapi.client.people.people.get({
'resourceName': 'people/me',
'requestMask.includeField': 'person.emailAddresses'
}).then(function (resp) {
//in the case of the email not being returned, the next line errors
var email = resp.result.emailAddresses[0].value;
$.ajax({
//do some application specific stuff using the email address
}
});
});
}
</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>
答案 0 :(得分:1)
与一位客户合作之后,我们发现Google Apps for Education目录中的信息默认为受保护。地区可以向所有客户开放此权限,也可以由客户赋予特定权限。对此进行调整后,上面显示的代码将完美运行。
谢谢
答案 1 :(得分:0)
根据the API docs,除了email
之外,您还应该请求profile
范围。除此之外,您可能想使用the OAuth2 API UserInfo method(您还需要添加email
范围,但这是一个更简单的API)。