如何在没有用户名和密码的情况下验证移动应用程序?

时间:2010-09-08 06:54:15

标签: iphone android authentication mobile web-applications

我正在构建一个使用OpenId来验证用户的Web应用程序,比如Stackoverlfow。还有一个移动应用程序,例如Android或iPhone。这些应用程序必须以某种方式进行身份验证或登录,以访问数据并更新属于用户的内容。由于没有可用于验证移动设备的用户名和密码,我想知道如何实现这一点。

我想到了两种方式:

  1. 在必须在设备上输入的服务器上生成一些密钥。当移动设备发送或请求数据时,该密钥将作为auth-key发送,并且用户可以通过该方式链接。使用此选项时,密钥应以某种方式传送给用户,因此他不必输入密钥。可能通过电子邮件,短信或扫描条形码。

  2. 移动应用程序使用浏览器或显示一个集成的Web-Panel,用于打开Webapp的特殊页面。在此页面上,用户必须登录,然后才允许移动应用程序读取和写入数据。

  3. 我的问题是:两种方式都可以保存吗?你更喜欢哪一个?有什么细节需要注意?有没有其他方法可以做到这一点?如果我做得好,就不可能在设备上使用OpenId,并以这种方式链接移动设备和webapp,对吗?

3 个答案:

答案 0 :(得分:4)

我已经做了以下工作来实现这个目标:

  • 当应用程序首次启动时,我会测试是否 有一个身份验证令牌和 如果它仍然有效
  • 如果没有,我使用[startActivityForResult] [1]打开我的登录活动
  • LoginActivity使用WebView并从网络应用程序中打开“身份验证应用”页面(例如https://www.yourdomain.com/authapp)。
  • 如果用户未登录webapp,则必须立即执行此操作。成功登录后,他将被重定向到“身份验证应用”页面
  • “身份验证应用”页面包含文本“您希望移动应用访问您的数据”以及“授予”和“取消”按钮。
  • 如果用户点击“授予”,则网络应用会生成身份验证令牌,将其写入数据库并重定向到响应页面,将生成的身份验证令牌附加到URL(例如https://www.yourdomain.com/authresponse?auth_token=dshf84z4388f4h
  • 移动应用程序从URL中提取令牌,并在与服务器通信时将其用于身份验证。

    WebLogin Activity如下所示:(注意:你必须覆盖“shouldOverrideUrlLoading”以保持在同一个WebView中。否则,当你收到一些重定向时,会打开一个新的浏览器)

    公共类WebLogin扩展了Activity {

    @覆盖 protected void onCreate(Bundle savedInstanceState){     super.onCreate(savedInstanceState);

    WebView webview = new WebView(this);
    webview.setWebViewClient(new WebViewClient() {  
    
        @Override  
        public boolean shouldOverrideUrlLoading(WebView view, String url){
            view.loadUrl(url);
            return true;  
        }  
    
        @Override
        public void onPageFinished(WebView view, String url) {
    
            if(StringUtils.contains(url, "?auth_token=")){
    
                // extract and save token here
    
                setResult(RESULT_OK);
                finish();
            }
        }
    });
    
    webview.loadUrl("https://www.yourdomain.com/authapp");
    webview.getSettings().setJavaScriptEnabled(true);
    setContentView(webview);
    

    } }

注意,我使用https进行此保存。如果您使用普通的http,则可以读取并窃取用户的令牌。

[1]:http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent,int)

答案 1 :(得分:0)

当前的OAuth规范(RFC5849)仍然要求用户将其凭据输入到包含受保护资源的网站。在移动应用程序上,这种用户体验并不是最好的(正如您所指出的那样,移动应用程序需要显示带有集成Web视图的auth页面)。 OAuth 2.0通过指定不同的访问授权类型来解决此问题。该标准仍处于起草阶段。在此之前,您最好的选择可能是修改OAuth 1.0的流量以适应移动设备,因为许多大型网站已经在做(例如Twitter带有xAuth,Dropbox带有developer API。< / p>

答案 2 :(得分:0)

我正在做类似于选项(1)的事情。创建一个唯一的链接(甚至只包括会话ID),然后通过短信发送。有很多廉价的批量短信提供商使用简单的API来完成这项工作。当用户点击SMS中的URL时,它将打开移动Web浏览器并将其登录。

之后,如果手机接受cookie,您可以设置一个。否则,用户将始终必须通过该唯一链接进入。