交叉验证_教程:使用安全用户身份验证构建Android应用程序

交叉验证

交叉验证

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册,再也不会建立auth了!

在本教程中,我们将构建一个简单的Android应用程序,该应用程序通过Stormpath和我们新的Android SDK管理的用户身份验证,远程存储用户生成的笔记。

本教程大约需要15分钟,它将演示将Stormpath集成到新的和现有的Android应用程序中是多么容易和无缝,并涵盖了Android开发中的一些安全性和性能问题。

演示

为什么要在Android应用程序中使用Stormpath?

Stormpath是一项身份验证服务,可以安全地存储您的用户帐户和私人用户信息。 另外,它是免费用于小型项目的!

拥有Stormpath之类的身份验证服务使您可以构建安全的移动应用程序,这些应用程序可以通过多种方式注册和登录用户,而不会损害设备的安全性。

使用Stormpath,用户可以使用带有签名JSON Web令牌OAuth2协议安全地登录。

network_service_diagram

使用Stormpath,您无需成为加密专家即可为您的应用程序创建值得信赖的大门。 在本教程的上下文中,“用户”位于客户端移动应用程序上,而“应用程序”位于Heroku上托管的服务器上。

使用Stormpath Android库可以轻松正确地实现用户身份验证,而不是花费大量时间和精力在您的下一个移动应用程序中构建安全的身份验证方法!

Stormpath Android库还可用于帮助构建更复杂的身份验证方案,例如多租户单点登录

在网络驱动的移动应用程序中,错误地实施身份验证可能会对您的用户造成巨大风险,并且会导致浪费大量时间和开发工作,而这些错误永远都不会引入。

尽早在移动应用程序代码库中实现适当的身份验证库是一种加快开发速度并减少以后挫败感的好方法。

让我们来构建一些东西!

让我们在Android中构建一个简单的笔记应用程序。 在本教程结束时,您将拥有一个应用程序,可让您以用户身份注册和登录,保存便笺并从服务器中检索该便笺。 从字面上看,将您的笔记数据与云后端同步!

本教程适用于用Java和Android SDK编写的Android应用。 如果您不够熟练,无法编写可在2,300种不同设备上运行的代码,那么还有一部Swift编写的iOS教程> :)

设置我们的Android项目

在本教程中,我们为您完成了所有后端工作,并且API服务器托管在https://stormpathnotes.herokuapp.com

典型的Stormpath集成主要涉及API服务器体系结构与Stormpath的后端服务进行通信。 这使您可以将Stormpath API密钥保留在服务器上,而不是在移动应用程序中进行硬编码。

要与您现有的后端集成(而不是我们的示例),请花一些时间查看我们特定于语言的服务器端教程。 或者-只需将该链接拍摄到您的后端团队=)

我们正在使用的后端API服务公开了两个受保护的端点,供您的Android应用程序使用:

  • GET /notes –以JSON对象的形式返回已认证用户的注释。
  • POST /notes –使用带有注释的JSON对象并将其保存给已认证的用户。

JSON对象始终采用以下形式:

{"notes": "The notes the user saved"}

如果您感到好奇,我们使用以下工具为Stormpath Notes构建后端:

  • Express –一个Node.js框架,可轻松构建API服务。
  • Express-Stormpath –为Express中的移动客户端公开可配置的REST API。
  • Stormpath –允许我们存储和验证用户,而无需为其创建自己的后端。
  • Heroku –在线托管Stormpath Notes的代码。

安装Stormpath

git clone https://github.com/stormpath/stormpath-android-notes-example.git

如果您想查看该项目的完成版本,请签出Finished分支

创建“ Notes” Android应用程序

使用Android Studio打开项目,并且应将其配置为编译。

包括Stormpath SDK的Gradle依赖项是:

compile 'com.stormpath.sdk:stormpath-sdk-android:1.1.3'

在Application类( NotesApp.java )中,在onCreate方法中添加以下内容:

// Initialize Stormpath
StormpathConfiguration stormpathConfiguration = new StormpathConfiguration.Builder()
    .baseUrl(baseUrl)
    .build();
Stormpath.init(this, stormpathConfiguration);

(可选)有关调试信息,请在StormpathConfiguration的方法调用之前添加此方法。

// We only want to show the logs in debug builds, for easier debugging.
if (BuildConfig.DEBUG) {
    Stormpath.setLogLevel(StormpathLogger.VERBOSE);
}

用户登录和注册流程

该项目包括用于预构建Stormpath登录的Java类。 这些文件也作为可配置的登录UI包含在Stormpath SDK-UI库中,这不同于SDK类。 如果需要自己的自定义用户体验,则可以在没有视图控件的情况下使用Stormpath.login网络方法。

这些SDK-UI类使用Stormpath SDK对运行Stormpath依赖关系的服务器进行身份验证。

可以使用以下命令启动StormpathLoginActivity

startActivity(new Intent(this, StormpathLoginActivity.class));

NotesActivity.java ,有一些实例需要显示StormpathLoginActivity

onResume方法中,我们可以通过抓取用户个人资料来检查是否有登录的用户。 如果没有,请显示“登录名”,否则,检索注释。

Stormpath.getUserProfile(new StormpathCallback<UserProfile>() {
    @Override
    public void onSuccess(UserProfile userProfile) {
        getNotes();
    }
 
    @Override
    public void onFailure(StormpathError error) {
        // Show login view
        startActivity(new Intent(context, StormpathLoginActivity.class));
    }
});```
 
**NOTE**: Stormpath access tokens are automatically created for users who sign into your application, and are stored securely on your Android device using [SharedPreferences](http://developer.android.com/reference/android/content/SharedPreferences.html).
 
For our custom endpoints `/notes`, we are using the [OkHttp3](https://square.github.io/okhttp/3.x/okhttp/okhttp3/package-summary.html) library.
 
So let's initialize the OkHttp3 objects in the `NotesActivity.java`'s `onCreate()` method.
 
```java
// Initialize OkHttp library.
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
    @Override
    public void log(String message) {
        Stormpath.logger().d(message);
    }
});
 
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
this.okHttpClient = new OkHttpClient.Builder()
        .addNetworkInterceptor(httpLoggingInterceptor)
        .build();

查看私有方法getNotes()saveNote()以获得OkHttp3方法准备的示例。

这两种方法的工作方式是它们形成请求,添加标头,进行网络调用,并在网络成功响应后广播到应用程序的另一部分。

private void saveNote() {
    RequestBody requestBody = new FormBody.Builder()
            .add("notes", mNote.getText().toString())
            .build();
 
    Request request = new Request.Builder()
            .url(NotesApp.baseUrl + "notes")
            .headers(buildStandardHeaders((Stormpath.accessToken())))
            .post(requestBody)
            .build();
 
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override public
        void onFailure(Call call, IOException e) {
        }
 
        @Override public void onResponse(Call call, Response response)
                throws IOException {
            Intent intent = new Intent(ACTION_POST_NOTES);
            LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
        }
    });
}
private void getNotes() {
    Request request = new Request.Builder()
            .url(NotesApp.baseUrl + "notes")
            .headers(buildStandardHeaders(Stormpath.accessToken()))
            .get()
            .build();
 
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override public
        void onFailure(Call call, IOException e) {
        }
 
        @Override public void onResponse(Call call, Response response)
                throws IOException {
            JSONObject mNotes;
 
            try {
                mNotes = new JSONObject(response.body().string());
                String noteCloud = mNotes.getString("notes");
 
                // You can also include some extra data.
                Intent intent = new Intent(ACTION_GET_NOTES);
                intent.putExtra("notes", noteCloud);
 
                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
            } catch (JSONException e) {
            }
        }
    });
}

这两种方法都需要正确准备Headers对象以进行身份​​验证。 buildStandardHeaders()为您做到这一点:

private Headers buildStandardHeaders(String accessToken) {
    Headers.Builder builder = new Headers.Builder();
    builder.add("Accept", "application/json");
 
    if (StringUtils.isNotBlank(accessToken)) {
        builder.add("Authorization", "Bearer " + accessToken);
    }
 
    return builder.build();
}

在Stormpath数据库中,Notes键/值对存储在用户的“ CustomData”字段中。 尽管可以将任意键/值对添加到用户的对象,但是Stormpath不能用作任意对象存储。

saveNotes()是内称为FloatingActionButtononClickListener

最后,让我们在工具栏的菜单中添加注销方法。 在onOptionsItemSelected找到有关(id == R.id.action_logout)if statement ,并添加以下内容:

Stormpath.logout();
startActivity(new Intent(context, StormpathLoginActivity.class));

现在,用户将能够注销,并且将立即显示“登录”流程。

可选的其他方法是保存Notes客户端。

现在编译并运行! 如果现在运行并再次尝试您的应用程序,您会发现现在可以注册用户,登录并保存便笺了!

下一步是什么?

尝试使用iOS SDK –如果您(的朋友)正在从事iOS开发,请尝试按照Stormpath NotesiOS教程进行操作。 由于该应用将针对相同的API发出请求,因此您会注意到,您可以将笔记保存在一台设备上,然后在另一台设备上打开它们!

使用Stormpath构建后端–尝试从头开始构建此API! Stormpath Notes的示例后端只有45行代码! 请参阅GitHub上的代码。 或者,尝试使用express-stormpathstormpath-laravel入门(即将推出更多集成!)

Stormpath是免费使用的,可以帮助您的团队编写安全,可扩展的应用程序,而不必担心身份验证,授权和用户安全性的细节。 立即注册一个帐户!

建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册,再也不会建立auth了!

翻译自: https://www.javacodegeeks.com/2016/12/tutorial-build-android-application-secure-user-authentication.html

交叉验证

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值