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>