首页 > 解决方案 > 如何在laravel 5.7中使用retrofit send to api从android创建护照令牌,还有比护照更好的选择来进行身份验证

问题描述

Android 改造应该创建护照令牌并发送到 laravel rest api 并添加到数据库。有没有比护照更好的选择可以在 laravel5.7 和 android 中使用。

标签: androidlaravelretrofitlaravel-passport

解决方案


您不能在 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_tokenexpired_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;
}

希望对您有所帮助。


推荐阅读