我目前正在尝试在使用Azure移动应用程序构建的Android应用程序中实现自定义身份验证作为后端。我已经关注了许多不同的信息,觉得我要转圈,可能在这个阶段遗漏了一些简单的东西。我将尽可能详细地列出我所做的一切。
我想要实现的目标是什么?
使用存储在数据库表中的登录凭据进行验证。
到目前为止我得到了什么?
到目前为止,我已经获得了自定义api验证用户/密码凭据,然后使用&#39; azure-mobile-apps / src / auth&#39; <返回JWT令牌/ p>
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'
答案 0 :(得分:0)
让我先说一下这个答案:我很傻!
后端的所有内容都按预期工作,因此为什么令牌在Postman上用于x-zumo-auth标头。
然而,我使用以下代码来提取我的令牌:result.getAsJsonObject().get("token").toString()
我应该如下:
result.getAsJsonObject().get("token").getAsString()
原因是.toString()方法在我的令牌上留下引号,所以不是eySKANDadnzl65 ......而是用引号读作“eySDKANDadnzl65 ......”。
这导致客户端返回无消息异常。我只是通过多次阅读日志来发现它,并发现当我每次输出令牌时都会输出令牌。
我会把这个放在这里,以防万一其他人像我一样碰巧犯了这个错误。