使用Google+登录验证对App Engine后端的呼叫

时间:2014-07-23 07:25:31

标签: javascript google-app-engine google-plus google-cloud-endpoints

所以我按照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>

Github sample

for Google+

2。)他们两个人在加载时都有回调,我也不知道他们怎么可能&#34;合并&#34;某处

3.)无论如何,我试图同时运行它们,并且在某些时候,调用和EndPoint方法。 user 参数为null。

我想知道这是否真的可行,或者我只是在浪费时间在这方面的努力?使用Google+登录用户可能会为应用提供更多功能。

对此有何想法?

2 个答案:

答案 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之上构建应用程序。