【问题标题】:How to authenticate a mobile App without username and password?如何在没有用户名和密码的情况下验证移动应用程序?
【发布时间】:2011-04-09 13:56:22
【问题描述】:

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

我想到了两种方法:

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

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

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

【问题讨论】:

  • @CommonsWare:我会看看这个。
  • @CommonsWare:看起来你的建议和@Nic-Strong 一样,对吧?我不明白它是如何工作的,请参阅下面的评论。

标签: iphone android authentication mobile web-applications


【解决方案1】:

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

  • 当应用程序第一次启动时,我测试是否 有一个身份验证令牌和 如果它仍然有效
  • 如果没有,我使用 [startActivityForResult][1] 打开我的登录活动
  • Lo​​ginActivity 使用 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 {

    @覆盖 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,整数)

【讨论】:

  • 这基本上也是我的做法。我使用 REST 方法并将身份验证令牌返回给本机应用程序。本机应用程序存储令牌并将令牌作为参数传递给我的其他 REST 方法。我有一个为每个 REST 方法调用的验证方法并检查身份验证令牌。不确定这是否是正确的方法,但它有效!
【解决方案2】:

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

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

【讨论】:

  • 但是cookie只能被浏览器访问,不是吗?我正在构建一个原生应用程序。
【解决方案3】:

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

【讨论】:

  • 我不明白。你建议我的网络应用程序提供一些身份验证机制,如 Twitter 的 xAuth?如果我猜对了,twitter 的 xAuth 会请求用户名和密码,并给你一个 auth_token 作为交换。优点是,您的移动应用程序不存储用户名和密码。但是,我的网络应用程序不存储任何用户名或密码,只存储我从 openId 提供程序获得的身份验证令牌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多