Try to run get_params() on your final pipeline object, not just the estimator. This way it'd generate all available pipe-items unique keys for the grid parameters.
sorted(pipeline.get_params().keys())
['classifier',
 'classifier__bootstrap',
 'classifier__class_weight',
 'classifier__criterion',
 'classifier__max_depth',
 'classifier__max_features',
 'classifier__max_leaf_nodes',
 'classifier__min_impurity_split',
 'classifier__min_samples_leaf',
 'classifier__min_samples_split',
 'classifier__min_weight_fraction_leaf',
 'classifier__n_estimators',
 'classifier__n_jobs',
 'classifier__oob_score',
 'classifier__random_state',
 'classifier__verbose',
 'classifier__warm_start',
 'steps',
 'tfidf',
 'tfidf__analyzer',
 'tfidf__binary',
 'tfidf__decode_error',
 'tfidf__dtype',
 'tfidf__encoding',
 'tfidf__input',
 'tfidf__lowercase',
 'tfidf__max_df',
 'tfidf__max_features',
 'tfidf__min_df',
 'tfidf__ngram_range',
 'tfidf__norm',
 'tfidf__preprocessor',
 'tfidf__smooth_idf',
 'tfidf__stop_words',
 'tfidf__strip_accents',
 'tfidf__sublinear_tf',
 'tfidf__token_pattern',
 'tfidf__tokenizer',
 'tfidf__use_idf',
 'tfidf__vocabulary']
This is especially useful when you're using the short make_pipeline() syntax for Piplines, where you don't bother with labels for pipe items:
pipeline = make_pipeline(TfidfVectorizer(), RandomForestClassifier())
sorted(pipeline.get_params().keys())
['randomforestclassifier',
 'randomforestclassifier__bootstrap',
 'randomforestclassifier__class_weight',
 'randomforestclassifier__criterion',
 'randomforestclassifier__max_depth',
 'randomforestclassifier__max_features',
 'randomforestclassifier__max_leaf_nodes',
 'randomforestclassifier__min_impurity_split',
 'randomforestclassifier__min_samples_leaf',
 'randomforestclassifier__min_samples_split',
 'randomforestclassifier__min_weight_fraction_leaf',
 'randomforestclassifier__n_estimators',
 'randomforestclassifier__n_jobs',
 'randomforestclassifier__oob_score',
 'randomforestclassifier__random_state',
 'randomforestclassifier__verbose',
 'randomforestclassifier__warm_start',
 'steps',
 'tfidfvectorizer',
 'tfidfvectorizer__analyzer',
 'tfidfvectorizer__binary',
 'tfidfvectorizer__decode_error',
 'tfidfvectorizer__dtype',
 'tfidfvectorizer__encoding',
 'tfidfvectorizer__input',
 'tfidfvectorizer__lowercase',
 'tfidfvectorizer__max_df',
 'tfidfvectorizer__max_features',
 'tfidfvectorizer__min_df',
 'tfidfvectorizer__ngram_range',
 'tfidfvectorizer__norm',
 'tfidfvectorizer__preprocessor',
 'tfidfvectorizer__smooth_idf',
 'tfidfvectorizer__stop_words',
 'tfidfvectorizer__strip_accents',
 'tfidfvectorizer__sublinear_tf',
 'tfidfvectorizer__token_pattern',
 'tfidfvectorizer__tokenizer',
 'tfidfvectorizer__use_idf',
 'tfidfvectorizer__vocabulary']