使用 Servicestack 通过 Facebook 验证用户 (Java & Swift)
Authenticating user with Facebook using Servicestack (Java & Swift)
我在 Android(Java) 和 iOS(Swift) 应用程序中使用 servicestack 客户端,但我需要使用 facebook 和 google,你知道是否存在像 Xamarin.Auth https://github.com/xamarin/Xamarin.Auth 这样的模块,但对于本机应用程序?
谢谢
看看AndroidJavaChat which is a port of the C# Xamarin.Android Chat it explains a couple of different ways of Authenticating with Facebook using their SDK and leveraging the new support for Authenticating using an AccessToken in ServiceStack v4.5.7+ that's now available on MyGet。
首先按照 install Facebook's SDK 的入门指南进行操作。
然后检查 LoginButtonActivity 的实施,它使用您可以在 Layout.xml 中定义的 Facebook 登录按钮进行身份验证:
<com.facebook.login.widget.LoginButton
android:id="@+id/btnFacebookLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp" />
Signing in with Facebook Login Button
要使用 Facebook 的 SDK,您需要在 AndroidManifest.xml:
中定义您的 AppId
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
从您在 https://developers.facebook.com/apps
中创建的应用中为您的 Facebook 应用使用 ApplicationId
然后您可以通过在 LoginButton
上注册回调来使用 Facebook 登录按钮进行身份验证。之后,只需处理 Facebook onSuccess()
、onCancel()
和 onError()
回调即可。当触发 onSuccess()
回调时,这意味着用户已成功登录到我们的 Android 应用程序,然后我们需要通过使用用户的 Facebook AccessToken
发出经过身份验证的请求来使用我们的 ServiceStack 聊天服务器进行身份验证,例如:
facebookCallback = CallbackManager.Factory.create();
btnFacebookLogin = (LoginButton) findViewById(R.id.btnFacebookLogin);
btnFacebookLogin.setReadPermissions("email"); // Ask user for permission to view access email address
btnFacebookLogin.registerCallback(facebookCallback, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
UiHelpers.setStatus(txtStatus, "Local facebook sign-in successful, signing into server...");
App.get().getServiceClient().postAsync(new dtos.Authenticate()
.setProvider("facebook")
.setAccessToken(loginResult.getAccessToken().getToken())
.setRememberMe(true),
r -> {
UiHelpers.setStatus(txtStatus, "Server facebook sign-in successful, opening chat...");
Intent intent = new Intent(activity, MainActivity.class);
stopProgressBar();
startActivity(intent);
},
error -> {
UiHelpers.setStatusError(txtStatus, "Server facebook sign-in failed", error);
stopProgressBar();
});
}
@Override
public void onCancel() {
stopProgressBar();
}
@Override
public void onError(FacebookException exception) {
Log.e(exception);
stopProgressBar();
}
});
一旦用户通过 ServiceStack 服务器进行身份验证,经过身份验证的会话 Cookie 就会在服务客户端上配置,您现在可以使用它来发出经过身份验证的请求。
如果您想使用自己的自定义图像作为登录按钮登录,请按照 Signing in with Custom Facebook Image Button 中的步骤操作。
Automatically Sign-In previously Signed In Users
用户首次成功通过 Facebook 身份验证后,您可以从 Facebook AccessToken.getCurrentAccessToken()
访问他们保存的令牌,以自动登录以供将来重新启动,例如:
AccessToken facebookAccessToken = AccessToken.getCurrentAccessToken();
if (facebookAccessToken != null){
client.postAsync(dtos.Authenticate()
.setProvider("facebook")
.setAccessToken(facebookAccessToken.getToken())
.setRememberMe(true),
r -> {
//User has signed using Saved Access Token
});
}
我在 Android(Java) 和 iOS(Swift) 应用程序中使用 servicestack 客户端,但我需要使用 facebook 和 google,你知道是否存在像 Xamarin.Auth https://github.com/xamarin/Xamarin.Auth 这样的模块,但对于本机应用程序?
谢谢
看看AndroidJavaChat which is a port of the C# Xamarin.Android Chat it explains a couple of different ways of Authenticating with Facebook using their SDK and leveraging the new support for Authenticating using an AccessToken in ServiceStack v4.5.7+ that's now available on MyGet。
首先按照 install Facebook's SDK 的入门指南进行操作。
然后检查 LoginButtonActivity 的实施,它使用您可以在 Layout.xml 中定义的 Facebook 登录按钮进行身份验证:
<com.facebook.login.widget.LoginButton
android:id="@+id/btnFacebookLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp" />
Signing in with Facebook Login Button
要使用 Facebook 的 SDK,您需要在 AndroidManifest.xml:
中定义您的 AppId<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
从您在 https://developers.facebook.com/apps
中创建的应用中为您的 Facebook 应用使用ApplicationId
然后您可以通过在 LoginButton
上注册回调来使用 Facebook 登录按钮进行身份验证。之后,只需处理 Facebook onSuccess()
、onCancel()
和 onError()
回调即可。当触发 onSuccess()
回调时,这意味着用户已成功登录到我们的 Android 应用程序,然后我们需要通过使用用户的 Facebook AccessToken
发出经过身份验证的请求来使用我们的 ServiceStack 聊天服务器进行身份验证,例如:
facebookCallback = CallbackManager.Factory.create();
btnFacebookLogin = (LoginButton) findViewById(R.id.btnFacebookLogin);
btnFacebookLogin.setReadPermissions("email"); // Ask user for permission to view access email address
btnFacebookLogin.registerCallback(facebookCallback, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
UiHelpers.setStatus(txtStatus, "Local facebook sign-in successful, signing into server...");
App.get().getServiceClient().postAsync(new dtos.Authenticate()
.setProvider("facebook")
.setAccessToken(loginResult.getAccessToken().getToken())
.setRememberMe(true),
r -> {
UiHelpers.setStatus(txtStatus, "Server facebook sign-in successful, opening chat...");
Intent intent = new Intent(activity, MainActivity.class);
stopProgressBar();
startActivity(intent);
},
error -> {
UiHelpers.setStatusError(txtStatus, "Server facebook sign-in failed", error);
stopProgressBar();
});
}
@Override
public void onCancel() {
stopProgressBar();
}
@Override
public void onError(FacebookException exception) {
Log.e(exception);
stopProgressBar();
}
});
一旦用户通过 ServiceStack 服务器进行身份验证,经过身份验证的会话 Cookie 就会在服务客户端上配置,您现在可以使用它来发出经过身份验证的请求。
如果您想使用自己的自定义图像作为登录按钮登录,请按照 Signing in with Custom Facebook Image Button 中的步骤操作。
Automatically Sign-In previously Signed In Users
用户首次成功通过 Facebook 身份验证后,您可以从 Facebook AccessToken.getCurrentAccessToken()
访问他们保存的令牌,以自动登录以供将来重新启动,例如:
AccessToken facebookAccessToken = AccessToken.getCurrentAccessToken();
if (facebookAccessToken != null){
client.postAsync(dtos.Authenticate()
.setProvider("facebook")
.setAccessToken(facebookAccessToken.getToken())
.setRememberMe(true),
r -> {
//User has signed using Saved Access Token
});
}