我正在开发一个使用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密钥初始化的吗?
答案 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
}
}