我正在构建一个使用OpenId来验证用户的Web应用程序,比如Stackoverlfow。还有一个移动应用程序,例如Android或iPhone。这些应用程序必须以某种方式进行身份验证或登录,以访问数据并更新属于用户的内容。由于没有可用于验证移动设备的用户名和密码,我想知道如何实现这一点。
我想到了两种方式:
在必须在设备上输入的服务器上生成一些密钥。当移动设备发送或请求数据时,该密钥将作为auth-key发送,并且用户可以通过该方式链接。使用此选项时,密钥应以某种方式传送给用户,因此他不必输入密钥。可能通过电子邮件,短信或扫描条形码。
移动应用程序使用浏览器或显示一个集成的Web-Panel,用于打开Webapp的特殊页面。在此页面上,用户必须登录,然后才允许移动应用程序读取和写入数据。
我的问题是:两种方式都可以保存吗?你更喜欢哪一个?有什么细节需要注意?有没有其他方法可以做到这一点?如果我做得好,就不可能在设备上使用OpenId,并以这种方式链接移动设备和webapp,对吗?
答案 0 :(得分:4)
我已经做了以下工作来实现这个目标:
移动应用程序从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 :(得分: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,您可以设置一个。否则,用户将始终必须通过该唯一链接进入。