android - 根据应用程序引擎端点对用户进行身份验证

标签 android google-app-engine authentication google-cloud-endpoints

我正在创建我的第一个应用程序引擎应用程序,但在验证用户身份时遇到问题。

我已关注https://cloud.google.com/appengine/docs/python/endpoints/consume_android#making_authenticated_calls - 似乎有点神奇,我只是“setAccountName”,它应该可以工作,但是我想它应该从 Android Audience 加载应用程序范围,然后检查我传递的帐户名是否实际登录设备。

API 调用有效,通过了身份验证,但遗憾的是 - 后端的“endpoints.get_current_user()”函数返回 None。

所以我继续挖掘,但我似乎找不到任何关于该主题的内容。我发现的最好的东西是 http://blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app - 但这是 6 年前的文章,作者使用 HTTP 客户端,与端点库没有任何关系。

我能想到的就是遵循一些“非端点”方式,将“使用 Google 登录”添加到我的应用程序中,然后尝试将我将获得的凭据传递给我的 API 构建器,但这感觉不对,就像应该有一种更简单的方法来做到这一点。

那么,我是否错过了 https://cloud.google.com/appengine/docs/python/endpoints/consume_android#making_authenticated_calls 中未提及的某些步骤? ?

实际代码(稍微简化)如下:

后端:

auth_api = endpoints.api(
    name='auth_api',
    version='v1.0',
    auth_level=endpoints.AUTH_LEVEL.REQUIRED,
    allowed_client_ids=[
        ANDROID_CLIENT_ID,
        WEB_CLIENT_ID,
        endpoints.API_EXPLORER_CLIENT_ID,
    ],
    audiences=[
        WEB_CLIENT_ID,
        endpoints.API_EXPLORER_CLIENT_ID,
    ],
    scopes=[
        'https://www.googleapis.com/auth/userinfo.profile',
        'https://www.googleapis.com/auth/userinfo.email',
    ],
)


@auth_api.api_class(resource_name='rating')
class RatingHandler(remote.Service):
    @endpoints.method(
        message_types.VoidMessage,
        RatingsMessage,
        path='rating/getRatings',
        http_method='GET',
    )
    def getRatings(self, request):
        rating_query = Rating.query(
            ancestor=ndb.Key(
                Account,
                endpoints.get_current_user().user_id(), // ERROR! endpoints.get_current_user() is None
            )
        ).order(-Rating.rating)

客户:

// Somewhere these lines exist
if (credential == null || credential.getSelectedAccountName() == null) {
    startActivityForResult(
        AuthUtils.getCredentials(getActivity()).newChooseAccountIntent(),
        AuthUtils.REQUEST_ACCOUNT_PICKER
    );
} else {
    LoadRatings();
}

@Override
public void onActivityResult(
    int requestCode,
    int resultCode,
    Intent data
) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null && data.getExtras() != null) {
        String accountName =
            data.getExtras().getString(
                AccountManager.KEY_ACCOUNT_NAME
            );
        if (accountName != null) {
            credential = GoogleAccountCredential.usingAudience(
                getApplicationContext(),
                "server:client_id:" + Constants.ANDROID_AUDIENCE
            );
            credential.setSelectedAccountName(accountName);
            LoadRatings();
        }
    }
}

public void LoadRatings() {
    // AuthApi was auto-generated by Google App Engine based on my Backend
    AuthApi.Builder api = new AuthApi.Builder(
        AndroidHttp.newCompatibleTransport(),
        new AndroidJsonFactory(),
        credential
    ).setApplicationName(getPackageName());
    AuthApi service = api.build();
    try {
        ApiMessagesRatingRatedBeerListMessage result = service.rating().getRatings().
        // some stuff done with result, but the Exception is thrown in line above

最佳答案

好吧,我明白了。当我从 API 声明中删除“范围”时,它就起作用了。我还不确定如何访问用户的电子邮件/个人资料,但这至少向前迈出了一步。

这个问题实际上之前已经提出过 - How to add more scopes in GoogleCloud Endpoints - 可悲的是,没有任何答案

关于android - 根据应用程序引擎端点对用户进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35986236/

相关文章:

java - 我想获得该程序的最终版本,但遇到了这个错误

ios - 我如何使用 Alamofire 进行基于 token 的身份验证?

azure - 使用 Azure AD B2C 用户流(或自定义策略)进行 SAFE Stack 身份验证 - 有人解决了这个问题吗?

java - 使用适用于桌面应用程序的 Java 开发工具包进行 AWS Cognito 登录

android - 具有自定义布局的 ListActivity 不调用 getview

java - Android ExpandableList onChildClickListener 在 Fragment 中不起作用

android - 多服务器环境中的 Android 应用程序的 Google 登录?

java - 从 Android 上传 Google App Engine Java Blobstore 无响应

google-app-engine - 如何在 IntelliJ IDEA 12 中重置 AppEngine 密码?

php - 在哪里可以找到 google_sql sql 数据库的用户名和密码?