提示:通过URL激活并发送参数
世界上最安全的密碼是不存在的密碼。 使用完全隨機的密鑰從等式中刪除用戶。 公平地說,這有一些缺點,并且密碼仍然存在于某個地方(在您的電話/電子郵件中),但通常效果很好。
訣竅很簡單,如果我們想對用戶進行身份驗證,我們可以通過電子郵件向他發送單個使用網址,例如mycoolapp://act-32548b09-d328-4330-8243-d7d30c322e40 。 如您所見,這很難猜測或蠻力。 一旦單擊,URL就會變得無效,因此即使以某種方式公開了該URL仍然是無關緊要的。 為此,我們需要兩個部分:
- 服務器邏輯
- 客戶端URL處理
兩者都很容易。
服務器
一個警告是mycoolapp將在設備上運行,但是您無法在電子郵件或瀏覽器中單擊它。 因此,我們需要您服務器上的https URL。
服務器看起來像這樣,請注意,這是Spring Boot Controller代碼,但是您應該可以使用那里的任何服務器:
public boolean sendSigninEmail(String e) {List<UserObj> ul = users.findByEmailIgnoreCase(e);if(ul.isEmpty()) {return false;}UserObj u = ul.get(0);u.setHashedActivationToken(UUID.randomUUID().toString()); (1)users.save(u); (2)email.sendEmail(e, "Signin to the Codename One App", "This is a one time link to activate the Codename One App. Click this link on your mobile device: \n\nhttps://ourserverurl.com/app/activateURL?token=act-" + u.getHashedActivationToken()); (3)return true; } public User activateViaToken(String t) throws ServerAppAPIException {List<UserObj> ul = users.findByHashedActivationToken(t); (4)if(ul.isEmpty()) {throw new ServerAppAPIException(ServerErrorCodes.NOT_FOUND);}UserObj u = ul.get(0);String val = u.getAppToken(); (5)u.setHashedActivationToken(null); (6)users.save(u);User r = u.getUser();r.setAppToken(u.getAppToken());return r; }| 1個 | 我們使用UUID生成長激活字符串 |
| 2 | 我們將其保存在數據庫中,覆蓋舊的URL(如果存在) |
| 3 | 我們可以發送帶有HTTPS URL的電子郵件或SMS來激活應用程序 |
| 4 | 接下來,我們使用收到的令牌激活用戶帳戶。 我們找到正確的帳戶條目 |
| 5 | 訪問令牌是服務器生成的安全密碼,它是完全隨機的,并且僅對應用程序可見 |
| 6 | 現在刪除了URL中使用的激活令牌,從而使URL成為一次性使用工具 |
所有這些大部分都很簡單,但是仍然缺少一個。 我們的應用程序需要一個mycoolapp URL,而HTTPS URL不會啟動它。 解決方案是302重定向:
@RequestMapping(value="/activateURL", method=RequestMethod.GET) public void activateURL(@RequestParam String token, HttpServletResponse httpServletResponse) {httpServletResponse.setHeader("Location", "mycoolapp://" + token);httpServletResponse.setStatus(302); }這會自動將設備發送到mycoolapp URL,并使用令牌啟動您的應用程序!
客戶端
在客戶端上,我們需要截獲mycoolapp URL并進行解析。 首先,我們需要添加兩個新的構建提示:
android.xintent_filter=<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="mycoolapp" /> </intent-filter> ios.plistInject=<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>com.mycompany.myapp.package.name</string> </dict> <dict> <key>CFBundleURLSchemes</key> <array> <string>mycoolapp</string> </array> </dict> </array>不要忘記將mycoolapp和com.mycompany.myapp.package.name修復為應用程序中的適當值
接下來,我們要做的就是在start()方法中檢測URL。 這需要駐留在檢查當前Form的代碼之前:
String arg = getProperty("AppArg", null); (1) if(arg != null) {if(arg.contains("//")) { (2)List<String> strs = StringUtil.tokenize(arg, "/");arg = strs.get(strs.size() - 1);while(arg.startsWith("/")) {arg = arg.substring(1);}}if(!arg.startsWith("act-")) { (3)showLoginForm();callSerially(() ->Dialog.show("Invalid Key", "The Activation URL is invalid", "OK", null));return;}arg = arg.substring(4);Form activating = new Form("Activating", new BorderLayout(BorderLayout.CENTER_BEHAVIOR_CENTER));activating.add(CENTER, new InfiniteProgress());activating.show();sendActivationTokenToServer(arg); (4)return; }| 1個 | 這是從全球導入的CN類中獲得的。 app參數是URL |
| 2 | 我們刪除參數的URL部分 |
| 3 | 使用act-前綴可以驗證URL是否正確 |
| 4 | 這會將激活密鑰發送到我們上面討論的服務器邏輯 |
在模擬器中測試
這將適用于iOS和Android。 從下周開始,您還可以使用模擬器中新的“發送應用程序自變量”菜單選項在模擬器上進行測試。
要將其正確集成到應用中,通常需要一個登錄菜單,該菜單僅接受電子郵件/電話。 或基于Web的UI中的系統將邀請鏈接發送到該應用。
Whatsapp使用此技巧的反面來激活其桌面應用程序。 他們會向您的設備顯示一個QR碼,一旦您使用whatsapp手機掃描該QR碼,就會激活桌面版本。 這比密碼要好得多。
翻譯自: https://www.javacodegeeks.com/2018/09/tip-activate-via-url-and-send-arguments.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的提示:通过URL激活并发送参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小鸡词典告新浪微博“抄袭案”一审败诉,创
- 下一篇: 网评《马斯克传》是“爽文结构