Azure移动应用程序 - Node.js后端 - Android客户端自定义身份验证

时间:2017-09-29 09:24:34

标签: android node.js authentication azure-mobile-services

我目前正在尝试在使用Azure移动应用程序构建的Android应用程序中实现自定义身份验证作为后端。我已经关注了许多不同的信息,觉得我要转圈,可能在这个阶段遗漏了一些简单的东西。我将尽可能详细地列出我所做的一切。

我想要实现的目标是什么?

使用存储在数据库表中的登录凭据进行验证。

到目前为止我得到了什么?

到目前为止,我已经获得了自定义api验证用户/密码凭据,然后使用&#39; azure-mobile-apps / src / auth&#39; <返回JWT令牌/ p>

Result from my login API

To get this api working I used this Github repo as a reference

我知道这个令牌有效,因为当我尝试访问我的一个标记有经过身份验证的访问的api时,我收到以下消息:您必须登录才能使用此应用程序但是当我附加时使用&#34; x-zumo-auth&#34; 作为标题的标记我可以毫无问题地访问api。

我被困在哪里?

我在Android客户端中收到令牌并尝试使用它来验证MobileServiceClient。我尝试了一些不同的方法,但似乎无法找出正确的方法,我现在拥有的是:

User user = new Gson().fromJson(result.getAsJsonObject().get("user"), User.class);
Log.d(TAG, "User: " + user.toString());
Log.d(TAG, result.getAsJsonObject().get("token").toString());
MobileServiceUser mobileServiceUser = new 
MobileServiceUser(user.getUsername());
mobileServiceUser.setAuthenticationToken(
                          result.getAsJsonObject().get("token").toString());
mClient.setCurrentUser(mobileServiceUser);

用户只是一个基本对象,它保存从登录API返回的其他信息。

执行上面的代码后,当我尝试访问需要身份验证的自定义api之一时,我得到以下stacktrace。 {}内没有留言,所以我真的不知道从哪里开始。也许有人之前已经这样做了,知道我失踪了什么?

  

java.util.concurrent.ExecutionException:com.microsoft.windowsazure.mobileservices.MobileServiceException:{}   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:500)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:479)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.google.common.util.concurrent.AbstractFuture $ TrustedFuture.get(AbstractFuture.java:76)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at ie.iskill.iskillmanagementmobile.azure.AzureServiceAdapter $ 3 $ 1 $ 1.run(AzureServiceAdapter.java:153)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at java.lang.Thread.run(Thread.java:818)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:引起:com.microsoft.windowsazure.mobileservices.MobileServiceException:{}   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection $ 1.onNext(MobileServiceConnection.java:128)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.microsoft.windowsazure.mobileservices.MobileServiceClient $ 15.handleRequest(MobileServiceClient.java:1610)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.microsoft.windowsazure.mobileservices.http.MobileServiceConnection.start(MobileServiceConnection.java:113)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:78)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at com.microsoft.windowsazure.mobileservices.http.RequestAsyncTask.doInBackground(RequestAsyncTask.java:35)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at android.os.AsyncTask $ 2.call(AsyncTask.java:292)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at java.util.concurrent.FutureTask.run(FutureTask.java:237)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587)   09-29 09:12:43.151 17172-17370 / {package} W / System.err:... 1更多

我尝试了什么?

在这里列出这些东西并不可行的事情有很多种不同的变化,我以前从未在这里张贴过,因为我通常只是喜欢抨击我的头脑来解决它们,但这次我真的难倒。 我浏览了几个不同的问题,并找到了一本“zumo”书。其中包含一篇关于AdrianHall自定义身份验证的章节(我无法用我的声誉链接两个以上的链接。)在几个问题中提到但无法找到我的问题的答案。

如果我遗漏了任何有用的信息,请在回复中告诉我,以便我尽快添加。

使用的Android SDK: compile&#39; com.microsoft.azure:azure-mobile-android:3.3.0@aar'

1 个答案:

答案 0 :(得分:0)

让我先说一下这个答案:我很傻!

后端的所有内容都按预期工作,因此为什么令牌在Postman上用于x-zumo-auth标头。

然而,我使用以下代码来提取我的令牌:

result.getAsJsonObject().get("token").toString()

我应该如下:

result.getAsJsonObject().get("token").getAsString()

原因是.toString()方法在我的令牌上留下引号,所以不是eySKANDadnzl65 ......而是用引号读作“eySDKANDadnzl65 ......”。

这导致客户端返回无消息异常。我只是通过多次阅读日志来发现它,并发现当我每次输出令牌时都会输出令牌。

我会把这个放在这里,以防万一其他人像我一样碰巧犯了这个错误。