laravel android api,Laravel RESTful API与Android应用程序
我正在使用Laravel 5 Framework开发一个Android应用程序和一个RESTful API.
我在登录活动时遇到了麻烦:流程是用户要求输入第8个字符的代码,并且服务器网络向他发送了一条SMS.然后,用户可以使用此代码(如密码)进行登录.
这是询问代码的代码:
private void askCode(String mobile) {
GsonRequest jsObjRequest = new GsonRequest(
Request.Method.GET,
WebAPIRoute.authGetCode + "/" + mobile,
String.class, null,
new Response.Listener() {
@Override
public void onResponse(String code) {
txtResponse.setText("Code asked successfully.");
}
},
new Response.ErrorListener() {
@Override
public void one rrorResponse(VolleyError volleyError) {
Toast.makeText(getBaseContext(), volleyError.getMessage(), Toast.LENGTH_SHORT).show();
}
});
this.requestQueue.add(jsObjRequest);
}
并且此方法在RESTful API中生成代码:
public function getCode($mobileNum)
{
//genero un numero casuale da mandare con l'sms
$code = mt_rand(10000000, 99999999);
Session::put('code', $code);
sendCode($mobileNum, $code); //send code by SMS
return response()->json(array("success"=>true));
}
生成的代码存储在Laravel的Session中(使用文件驱动程序配置).
当用户想要登录时,应用程序调用此方法:
private void saveUser(final String code, final String mobile, final String name) {
HashMap params = new HashMap();
params.put("nickname", name);
params.put("mobile", mobile);
params.put("code", code);
GsonRequest jsObjRequest = new GsonRequest(
Request.Method.POST,
WebAPIRoute.authValidateCode,
String.class,
params,
new Response.Listener() {
@Override
public void onResponse(String authtoken) {
final Account account = new Account(accountName, mAccountType);
String authtokenType = mAuthTokenType;
// Creating the account on the device and setting the auth token we got
// (Not setting the auth token will cause another call to the server to authenticate the user)
mAccountManager.addAccountExplicitly(account, code, null);
mAccountManager.setAuthToken(account, authtokenType, authtoken);
Bundle data = new Bundle();
data.putString(AccountManager.KEY_ACCOUNT_NAME, accountName);
data.putString(AccountManager.KEY_ACCOUNT_TYPE, mAccountType);
data.putString(AccountManager.KEY_AUTHTOKEN, authtoken);
data.putString(PARAM_USER_PASS, code);
data.putBoolean(ARG_IS_ADDING_NEW_ACCOUNT, true);
final Intent res = new Intent();
res.putExtras(data);
setAccountAuthenticatorResult(res.getExtras());
Intent i = new Intent(getBaseContext(), MyEventsActivity.class);
startActivity(i);
}
}
,
new Response.ErrorListener() {
@Override
public void one rrorResponse(VolleyError volleyError) {
Log.e(TAG, volleyError.getMessage(), volleyError);
showMessage("Errore nell'autenticazione. Riprova piu` tardi.");
}
});
requestQueue.add(jsObjRequest);
}
验证代码的API的方法如下:
public function validateCode() {
$code = trim(Input::get('code'));
$nickName = trim(Input::get('nickname'));
$phoneNum = trim(Input::get('mobile'));
if (empty($phoneNum))
abort(400, 'mobile parameters not provided.');
if (empty($code))
abort(400, 'code parameters not provided.');
if (empty($nickName))
abort(400, 'nickname parameters not provided.');
$validCode = Session::get('code');
Log::info('code: ' . $code . " validCode: " . $validCode);
if($code == $validCode) {
Session::forget('code');
// Retrieve the user by the attributes, or instantiate a new instance...
$user = User::firstOrCreate(['Mobile' => $phoneNum]);
//aggiorno i campi nickname e password col nuovo codice
$user->Nickname = $nickName;
$user->password = $code;
//save!
$user->save();
//viene usata l'autenticazione di Laravel e gli serve una password
$token = JWTAuth::attempt(['Mobile' => $phoneNum, 'password' => $code]);
return response()->json($token);
} else {
//return response()->json(array('success' => false, 'error' => 'The code isn\'t correct.'));
abort(401, 'The code isn\'t correct.' . $validCode);
}
}
我已经用Chrome和Firefox测试了RESTful API,并且登录有效.随着应用程序号.实际上,问题在于Session :: get(‘code’);在validateCode中始终返回一个空值.我检查了使用Session :: put(‘code’,$code);生成的Session文件;并且是正确的.但是,当调用Session :: get(‘code’)时,Laravel会生成另一个Session文件,似乎不使用前一个文件.
我在RESTful API中禁用了CSRF中间件.
怎么了?
解决方法:
在服务器端存储会话毫无意义. API假定是无状态的,因此第二次您完成对代码的第一个请求并将其存储在服务器端的会话中时,该会话将结束,下一个请求将不记得您设置的任何内容.
如果您想保持代码登录状态并避免使用令牌,那么您将不得不从android应用发送唯一的代码来识别用户.然后在服务器端生成代码,并将其存储在具有user_identifier和generate_code的表中,并创建一个模型来访问它,例如
尝试登录
user_id | generateCode
0001 | 87392042
0032 | 83214320
然后将其添加到saveUser
params.put("user_id", user_id); // can be the android device ID or even a unique timestamp
最后,在服务器端的validateCode中,将$validCode行替换为以下内容:
$user_id = trim(Input::get('user_id'));
....
$validCode = AttemptedLogin::where('user_id', $user_id)->first();
if($code == $validCode->generatedCode) {
$validCode->delete();
....
标签:laravel-5,rest,api,session,android
来源: https://codeday.me/bug/20191120/2041929.html
laravel android api,Laravel RESTful API与Android应用程序相关推荐
- 如何区别API、REST API、RESTful API和Web Service之间的异同
当你看到API接口你会想起什么?是接口.第三方调用.还是API文档?初看你可能会觉得这太熟悉了,这不是系统开发日常系列吗?但你仔细想一想,你会发现API的概念在你脑海里是如此的模糊.如何你通过搜索引擎 ...
- 架构师之路 — API 经济 — RESTful API
目录 文章目录 目录 REST REST 的优势 REST 的不足 RESTful API HATEOAS REST 早古时期,软件和网络是两个不同的领域,前者围绕着单机环境展开,而后者则研究系统之间 ...
- OData API 和 Restful API 这两个概念的区别和联系
我们在 SAP API Business Hub 里能看到 OData,SOAP 和 Restful 三种"不同"类型的 API: 它们之间到底有什么区别和联系? OData vs ...
- 使用ASP.NET Web API构建Restful API
目录 介绍 这种方法有什么好处? Restful约定 构建API 测试API 一点困惑: 最佳实践: 数据传输对象(DTO) Automapper IHttpActionResult 使用Web AP ...
- restapi是什么意思_用人类语言解释:REST API 与 RESTful API
API,应用程序接口,也可以叫应用程序界面,或者简称为应用接口.应用程序的设计可以相当复杂,但最终的用户并不需要知道应用程序的内部到底是如何工作的,你只需要给用户提供一些操作接口,再告诉用户怎么用这些 ...
- 一个基于Spring Boot的API、RESTful API项目骨架
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:简单的土豆 www.jianshu.com/p/99fcea ...
- 你值得拥有!一个基于 Spring Boot 的API、RESTful API 的项目
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 前言 最近使用Spring ...
- 一个mapper接口有多个mapper.xml 文件_爱了!分享一个基于Spring Boot的API、RESTful API项目种子(骨架)!...
点击上方"Java专栏",选择"置顶或者星标" 第一时间阅读精彩文章! 1.☞ 程序员进阶必备资源免费送「21种技术方向!」 点击查看☜ 2.☞ <Jav ...
- 架构师之路 — API 经济 — RESTful API 设计规范原则
目录 文章目录 目录 URI Request Methods Filter & Query Parameter Headers Request body Response Response S ...
- larvel 中的api.php_Laravel API 系列教程(一): 基于 Laravel 5.5 构建 测试 RESTful API...
Laravel API 系列教程(一): 基于 Laravel 5.5 构建 & 测试 RESTful API 由 学院君 创建于2年前, 最后更新于 9个月前 版本号 #3 171702 v ...
最新文章
- 硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
- liunx的目录结构
- 如何用C#语言构造蜘蛛程序
- python互相转换组合_Python基本类型的连接组合和互相转换方式(13种)
- 【Java面试题视频讲解】字符串按指定长度分隔
- 2021暑假实习-SSM超市积分管理系统-day09笔记
- C++ Primer 第五版 第6章 6.1——函数及函数定义及调用阅读笔记
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移...
- python excel处理模块_Python(00):openpyxl模块处理Excel文件
- 全国加油站分布数据/停车场分布/公园分布/景区分布/保护区分布/2020年poi感兴趣点
- 沙盘模拟软件_赛事动态 | 第十六届全国职业院校沙盘模拟经营大赛全国总决赛圆满举办...
- 最新计算机台式机小机箱,几款热门台式机主机机箱的参数配置【图文】
- 【小波分析】一、小波分析入门基础介绍
- 高精度地图,从入门到入行
- windows找不到gpedit.msc请确定文件名
- java多线程系列八之多线程之间的交互:线程阀
- Liang-GaRy啃linux书想吐(一)
- 华硕B85M-V PLUS 刷NVME协议BIOS
- EXCEL 自定义函数之公历转农历,VBA通过爬虫实现
- 新标签页 chrome://newtab/_380页超级可爱的猫头鹰主题环创素材包