Google Cloud端点和身份验证

时间:2014-12-14 11:25:42

标签: java google-app-engine authentication google-cloud-endpoints

我正在使用带有Java的Google Cloud Endpoints,我想为我的用户创建一个登录系统。我想要做的很简单:我只是希望他们在使用电子邮件和密码登录后保持会话。

然而,使用Cloud Endpoints似乎非常困难。我的用户似乎必须拥有一个Google帐户,我认为这是一个非常重要的限制,并且这是不可接受的。我看到了一些像这样的帖子:Google Cloud Endpoints limitations... any proposed solutions?但它没有回答我的问题。

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:2)

在没有Google用户帐户的情况下验证Android端点是不可能的!我尝试了各种方法,但仍然无法运作..

所以这是我解决这个问题的方法,没有任何用户交互(也许不是正确的但是有效,而且你有强大的身份验证(SHA1 + Google帐户)):

这是我的安卓代码

获取并构建有效凭据

  //Get all accounts from my Android Phone
         String validGoogleAccount = null;
         Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
         Account[] accounts = AccountManager.get(context).getAccounts();
         for (Account account : accounts) {
             if (emailPattern.matcher(account.name).matches()) {
                 //Just store mail if countain gmail.com
                 if (account.name.toString().contains("gmail.com")&&account.type.toString().contains("com.google")){
                     validGoogleAccount=account.name.toString();
                 }

             }
         }

        //Build Credential with valid google account
        GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(this,"server:client_id:301991144702-5qkqclsogd0b4fnkhrja7hppshrvp4kh.apps.googleusercontent.com");
        credential.setSelectedAccountName(validGoogleAccount);

使用此凭据进行安全通话

Campagneendpoint.Builder endpointBuilder = new Campagneendpoint.Builder(AndroidHttp.newCompatibleTransport(), new JacksonFactory(), credential);

这是我的API后备代码: API注释

@Api(
        scopes=CONSTANTES.EMAIL_SCOPE,
        clientIds = {CONSTANTES.ANDROID_CLIENT_ID, 
                     CONSTANTES.WEB_CLIENT_ID,
                     com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID},
        audiences = {CONSTANTES.ANDROID_AUDIENCE},      
        name = "campagneendpoint",
        version = "v1"
     )

方法代码:

public Collection<Campagne> getCampagnes(@Named("NumPortable")String NumPortable, User user) throws  UnauthorizedException {
        if (user == null) throw new UnauthorizedException("User is Not Valid");

      return CampagneCRUD.getInstance().findCampagne(NumPortable);
     }

目前,它仅适用于Android(我不知道我们将如何处理IOS,而无需重新编码我自己的oauth2 API ..)

希望它会对你有帮助!