android - 如何在laravel 5.7中使用retrofit send to api从android创建护照令牌,还有比护照更好的选择来进行身份验证
问题描述
Android 改造应该创建护照令牌并发送到 laravel rest api 并添加到数据库。有没有比护照更好的选择可以在 laravel5.7 和 android 中使用。
解决方案
您不能在 android 中创建令牌,您只需要发送您的信息并在 RegisterController 中
$this->validator($request->all())->validate();
event(new Registered($user = $this->create($request->all())));
$client = Client::where('password_client', 1)->first();
$request->request->add([
'grant_type' => 'password',
'client_id' => $client->id,
'client_secret' => $client->secret,
'username' => $request->all()['email'],
'password' => $request->all()['password'],
'scope' => null,
]);
// Fire off the internal request.
$token = Request::create(
'oauth/token',
'POST'
);
return \Route::dispatch($token);
然后它会返回给你access_token
和expired_at
。
在android中,您需要将令牌保存在 sharedPreferences
public class TokenManager {
private SharedPreferences prefs;
private SharedPreferences.Editor editor;
private static TokenManager INSTANCE = null;
private TokenManager(SharedPreferences prefs){
this.prefs = prefs;
this.editor = prefs.edit();
}
public static synchronized TokenManager getInstance(SharedPreferences prefs){
if(INSTANCE == null){
INSTANCE = new TokenManager(prefs);
}
return INSTANCE;
}
public void saveToken(AccessToken token){
editor.putString("ACCESS_TOKEN", token.getAccess_token()).commit();
editor.putString("REFRESH_TOKEN", token.getRefresh_token()).commit();
}
public void deleteToken(){
editor.remove("ACCESS_TOKEN").commit();
editor.remove("REFRESH_TOKEN").commit();
}
public AccessToken getToken(){
AccessToken token = new AccessToken();
token.setAccess_token(prefs.getString("ACCESS_TOKEN", null));
token.setRefresh_token(prefs.getString("REFRESH_TOKEN", null));
return token;
}
在 `RetrofitBuilder 类
public static <T> T createServiceWithAuth(Class<T> service, final TokenManager tokenManager) {
OkHttpClient newClient = client.newBuilder().addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
if (tokenManager.getToken().getAccess_token() != null) {
builder.addHeader("Authorization", "Bearer " + tokenManager.getToken().getAccess_token());
}
request = builder.build();
return chain.proceed(request);
}
}).authenticator(CustomAuthenticator.getInstance(tokenManager)).build();
Retrofit newRetrofit = retrofit.newBuilder().client(newClient).build();
return newRetrofit.create(service);
}
在你的活动中
TokenManager tokenManager;
Routes service;
service = RetrofitBuilder.createServiceWithAuth(Routes.class, tokenManager);
tokenManager = TokenManager.getInstance(getSharedPreferences("prefs", MODE_PRIVATE));
然后检查是否不为空
if (tokenManager.getToken().getAccess_token() != null) {
startActivity(new Intent(LoginActivity.this, MenuDrawerProfileActivity.class));
finish();
}
避免启动登录页面。在改造响应中把这个
tokenManager.saveToken(response.body());
最后别忘了声明 AccessToken Model
public class AccessToken {
String token_type;
int expires_in;
String access_token;
String refresh_token;
}
希望对您有所帮助。
推荐阅读
- svm - 径向基函数 (RBF) 内核
- python - 使用 db-api 进行 Python 类型提示
- python - 在 google cloud ml-engine 上训练 tensorflow/object-detection 模型时 matplotlib 的语法错误
- docker - Docker 复制卷
- opengl - 具有多重采样的 OpenGL 多重渲染目标 FBO - 要求
- angular - 在 ngOnInit 之前等待服务
- eclipse-plugin - 无法在 Eclipse 中生成图表编辑器
- python - 运行 manage.py 文件时 Django 显示错误
- polymer - Polymer 3.0 中的去抖器
- php - 在 foreach 循环内的 JSON 结果中显示键名