Как получить токен JWT в угловом приложении после успешного завершения OAuth на веб-интерфейсе? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть Flask REST API для сервера и угловой для клиента. Я пытаюсь сохранить маркеры OAuth Facebook для использования API Facebook на сервере. Поэтому я решил реализовать авторизацию на стороне сервера через Facebook OAuth, чтобы получить токен пользователя, зарегистрироваться и сгенерировать новый токен JWT для моего серверного приложения.

Используя Flask-Dance, я реализовал функцию обратного вызова, поэтому, если я вызываю server_host / login / facebook, он перенаправляет меня на страницу авторизации facebook, а при успешной авторизации он перенаправляет на server_host / login / authorised, где я регистрирую пользователя, если необходимо, сохраняю Facebook токен, сгенерируйте для него собственный сервер JWT и верните его.

Что делает мой angular, так это открывает новое окно (window.open ()) с адресом server_host / login / facebook и после авторизации я вижу свой ответ JWT. Но как закрыть это окно при успешном входе в систему и заставить этот JWT сохранять в угловом приложении?

Мой подход похож на CORS - Facebook - Паспорт и это Могу ли я использовать гранты с кодом авторизации для SPA, тесно связанного с API (которым я владею)? . Я тихий новичок в этом. Может быть, я чего-то не понял. Но я не знаю, как получить мой токен JWT в моем угловом приложении.

На стороне сервера (фляга-танец, JWT)

login_bp = make_facebook_blueprint(
    client_id="my_client_id", 
    client_secret="my_secret",
    scope="instagram_basic,instagram_manage_comments"
)

login_bp.storage = SQLAlchemyStorage(OAuth, db.session, user=get_jwt_identity)

# create/login local user on successful OAuth login
@oauth_authorized.connect_via(login_bp)
def facebook_logged_in(blueprint, token):
    # getting response info, register etc.    
    access_token = create_access_token(identity=oauth.user.nickname)
    return jsonify({'access-token': access_token})

Что теперь делает мой угловой компонент:

@Component({
  selector: 'app-auth',
  templateUrl: './auth.component.html',
  styleUrls: ['./auth.component.css']
})
export class AuthComponent implements OnInit {
  constructor() { }

  ngOnInit() { }

  login() {
    const w = window.open('https://localhost:5000/login/facebook', 'authWindow', 'location=0,width=300,height=214');
  }
}
...