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

Tim*_*the 4 iphone authentication mobile android web-applications

我正在构建一个使用 OpenId 来验证用户身份的 Web 应用程序,就像 Stackoverlfow 所做的那样。也会有一个移动应用程序,例如 Android 或 iPhone。这些应用程序必须以某种方式进行身份验证或登录,才能访问数据并更新属于用户的内容。由于无法提供用户名和密码来验证移动设备,我想知道如何实现这一点。

我想到了两种方法:

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

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

我的问题是:这两种方法都可行且安全吗?您更喜欢哪一个?有哪些细节需要注意?还有其他方法可以做到这一点吗?如果我没问题的话,就不可能在设备上使用 OpenId,并以这种方式链接移动设备和 web 应用程序,对吧?

Tim*_*the 5

为了实现这一目标,我做了以下工作:

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

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

    公共类 WebLogin 扩展 Activity {

    @Override protected void onCreate(Bundle savingInstanceState) { 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);
    
    Run Code Online (Sandbox Code Playgroud)

    } }

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

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