3

我正在使用 Gigya 开发一个 Android 应用程序,以允许人们使用 Facebook 和 Twitter 进行注册;与此同时,另一位开发人员也在 iOS 中做同样的事情。我们要实现自定义登录 UI。

标准方法使用 Gigya 自己的 UI,并在此处记录:

http://developers.gigya.com/035_Mobile_SDKs/020_Android#Logging_in_the_User

下面,它只是建议:

如果您想自己实现图形设计,请改用登录方法。

标准登录方法使用方法调用专用的登录后回调,onLogin(...)并且所有后续流程都被描述为源自此事件。另一种登录方法调用标准onGSResponse(...)回调;目前尚不清楚如何使用响应来构造用户,因此我将实现设置为调用socialize.getUserInfo. 尝试调用这两种方法都导致了许多异常错误。

根据我开始使用的 Gigya 说明

mGSAPI = new GSAPI(GIGYA_APP_KEY, this);
mGSAPI.setAPIDomain("eu1.gigya.com");

in onCreate(...)(其中GIGYA_APP_KEY是从我们的控制台复制的值)。我之所以调用 setAPIDomain,是因为我们遇到了无效的数据中心错误(尽管是 500001 代码,而不是 301001 代码!),这已解决。

Facebook 登录按照我的预期通过登录流程,然后返回错误 400093(文档告诉我这是一个无效的 API 参数,并显示消息“缺少参数:client_id”)。

Twitter登录返回206002,“Account Pending Verification”,这似乎是有道理的;然后我打电话

mGSAPI.sendRequest(
        "getUserInfo",
        null, //parameters
        true, //use HTTPS
        this, //the callback
        null //a context object
);

这给了我错误:

缺少必需的参数:未提供秘密或签名。无法验证请求。

Web 应用程序需要建议 UID的文档socialize.getUserInfo,但本机应用程序不需要。它没有提到其他必填字段。我有点卡住了......GSAPI对象不应该处理验证,因为它是用 API 密钥初始化的吗?

4

1 回答 1

1

我可以在非常高的水平上为您提供一些集成 GIGYA 的方向。(下面的代码不是逐字记录的)希望它有所帮助。

对于一个私有的 Android 应用程序,我创建了一个管理器对象 (GigyaManager),它维护了一个 GSAPI 对象的单例实例。

这个单例 GigyaManager 在我的应用程序对象中初始化:

public static GigyaManager getInstance(String apiKey, Context context) {
    mGSAPI = new GSAPI(apiKey, context);
}

我的 GigyaManager 类也有一个包装方法来处理带有社交服务的登录:

public void loginWithSocialService(GigyaSocialProvider provider, GSResponseListener listener) throws Exception {
        // did the user attempt a social login, and bail out on the registration
        // phase?
        if (GigyaManager.getInstance().getGSAPI().getSession() != null) { 
            logout();
        }


        GSObject providerArgs = new GSObject();
        providerArgs.put(GigyaManager.GIGYA_ARG_PROVIDER, provider.name().toLowerCase());

        mGSAPI.login(providerArgs, listener, null);
    }

这是从包含“登录”按钮的片段中的 onClick 侦听器触发的:

GigyaManager.getInstance("appKey", getActivity()).loginWithSocialService(GigyaSocialProvider.FACEBOOK, this);

该片段必须实现具有回调来处理登录是否成功的 GSResponseListener:

@Override
public void onGSResponse(String method, GSResponse response, Object context) {
    if (!method.equalsIgnoreCase("login") || response.getErrorCode() != 0) {
        return;
    }
    GIGYAResponseWrapper resp = new GIGYAResponseWrapper(response.getResponseText());

    // user is attached to login provider? 
    if (resp.isIsAttached()) {
        // start some sort of loader or asynctask to get information about user account
        // connected to GIGYA social login

        Bundle args = new Bundle();
        args.putString(ARG_UID, resp.getUid());
        args.putString(ARG_UID_SIGNATURE, resp.getUidSignature());
        args.putString(ARG_SIGNATURE_TIMESTAMP, resp.getSignatureTimestamp());
        args.putString(ARG_SOCIAL_NICKNAME, resp.getNickname());

    } else {
        // login success, but this social account is not associated with anything in GIGYA
    }
}
于 2013-04-16T23:20:13.963 回答