所以我按照QuickStart应用程序(Web)添加了一个Google+登录按钮,如其文档中所述:https://developers.google.com/+/web/signin/add-button
我让那部分工作正常,花花公子,本地以及部署到App Engine。
现在,我想利用Google+登录提供的机会,以类似的方式对后端 EndPoint 进行经过身份验证的调用:https://developers.google.com/appengine/docs/java/endpoints/consume_js
这可能吗?我想知道Google+身份验证的哪一部分会合并"在这个流程中,这样我就不必打电话了
gapi.auth.authorize({client_id: CLIENT_ID,
scope: SCOPES, immediate: mode},
authorizeCallback);
再次,因为我的用户已经使用Google+登录登录了用户!
另外,我的实验中有两个观察结果可以使这两个一起工作:
1。)我必须"导入" 2个看起来相似的脚本,即:
<script src="https://apis.google.com/js/client.js?onload=init">
对于OAuth2&#34; style&#34;,以及
<script src="https://apis.google.com/js/client:plusone.js"></script>
(docs)
OR
<script src="https://plus.google.com/js/client:plusone.js"></script>
for Google+
2。)他们两个人在加载时都有回调,我也不知道他们怎么可能&#34;合并&#34;某处
3.)无论如何,我试图同时运行它们,并且在某些时候,调用和EndPoint方法。 user 参数为null。
我想知道这是否真的可行,或者我只是在浪费时间在这方面的努力?使用Google+登录用户可能会为应用提供更多功能。
对此有何想法?
答案 0 :(得分:1)
我通过查找并查看使用Google+登录方式的Tic Tac Toe example来连接应用程序的Google Cloud EndPoint ,然后如示例所示,调用需要授权的方法。
The documentation,使用Tic Tac Toe示例让我离开,因为它正在使用&#34;普通的OAuth&#34;,与Github中的Tic Tac Toe示例相比,它可能已更新为使用Google+登入。
无论如何,我发现它实际上非常流畅和简单。在使用成功的身份验证执行Google+登录回调时,您现在可以加载您的API并从那里开始。例如,
function signinCallback(authResult) {
if (authResult['status']['signed_in']) {
// Update the app to reflect a signed in user
// Hide the sign-in button now that the user is authorized, for example:
document.getElementById('signinButton').setAttribute('style', 'display: none');
// we are now authenticated at this point, and we can load our
// Google Cloud Endpoints
gapi.client.load(apiName, apiVersion, apiCallback, apiRoot);
} else {
// Update the app to reflect a signed out user
// Possible error values:
// "user_signed_out" - User is signed-out
// "access_denied" - User denied access to your app
// "immediate_failed" - Could not automatically log in the user
console.log('Sign-in state: ' + authResult['error']);
}
}
之后,当我的Google Cloud EndPoint API方法被调用时,它现在会像以前一样接收用户对象而不是null。
/**
* This inserts a new <code>Payload</code> object.
*
* @param payload The object to be added.
* @return The object to be added.
*/
@ApiMethod(name = "insertPayload")
public MapPackage insertPayload(Payload payload, User user) throws OAuthRequestException {
// Implement this function
LOG.info("Calling insertPayload method");
if (user == null) {
LOG.warning("User is null!");
} else {
//YEHEEY!!!!
LOG.warning("User ID:" + user.getUserId());
LOG.warning("User AuthDomain:" + user.getAuthDomain());
LOG.warning("User nickname:" +user.getNickname());
LOG.warning("User fedId:" +user.getFederatedIdentity());
LOG.warning("User email:" +user.getEmail());
}
return payload;
}
另外需要注意的是,使其运行的最小范围是
email
您应该在后端API签名以及HTML + Javascript客户端中引用相同的范围。例如,在Backend API注释中:
import javax.inject.Named;
/**
* An endpoint class we are exposing
*/
@Api(name = "yourservicename",
version = "v1",
scopes = { https://www.googleapis.com/auth/plus.login },
clientIds = {Constants.WEB_CLIENT_ID, Constants.DEBUG_ANDROID_CLIENT_ID, Constants.PROD_ANDROID_CLIENT_ID},
audiences = {Constants.ANDROID_AUDIENCE},
namespace = @ApiNamespace(ownerDomain = "backend.yourappname.yourcompany.com",
ownerName = "backend.yourappname.yourcompany.com",
packagePath = ""))
HTML标记:
<span id="signinButton">
<span
class="g-signin"
data-callback="signinCallback"
data-clientid="YOUR_CLIENT_ID"
data-cookiepolicy="single_host_origin"
data-requestvisibleactions="http://schema.org/AddAction"
data-scope="https://www.googleapis.com/auth/plus.login">
</span>
</span>
希望这有帮助!
答案 1 :(得分:0)
查看Google+ Photohunt sample in Java。此应用程序向您展示如何使用RESTful客户端在Google App Engine之上构建应用程序。