使用自定义登录UI在移动应用中登录Gigya的流程

时间:2013-04-16 12:38:20

标签: android login gigya

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

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

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

在下面,它只是建议:

  

如果您希望自己实施图形设计,请改用login方法。

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

按照Gigya说明,我正在启动

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

(其中GIGYA_APP_KEY是从我们的控制台复制的值)。我正在调用setAPIDomain,因为我们收到了一个无效的数据中心错误(尽管有500001代码,而不是301001代码!),这已经修复了。

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

Twitter登录回复206002,“账户待审核”,这似乎有意义;然后我打电话给

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

这给了我错误:

  

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

The documentation for socialize.getUserInfo建议网络应用需要UID,但不适用于本地应用。它没有提及其他强制性字段。我有点卡住...... GSAPI对象不应该处理验证,因为它是用API密钥初始化的吗?

1 个答案:

答案 0 :(得分:1)

我可以为您整合GIGYA提供一个非常高的方向。 (以下代码不是逐字的)希望它有点帮助。

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

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

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

我的GigyaManager类还有一个用于处理登录w / social services的包装器方法:

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
    }
}