Как получить заголовок Авторизационный канал?

Я хотел бы получить заголовок Authorization Bearer для целей OAuth, но это выглядит немного запутанно, читая документы

use nickel::{Nickel, JsonBody, HttpRouter, Request, Response, MiddlewareResult, MediaType};

    // Get the full Authorization header from the incoming request headers
    let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() {
        Some(header) => header,
        None => panic!("No authorization header found")
    };

Это генерирует ошибку:

src / main.rs: 84: 56: 84:86 ошибка: черта hyper::header::HeaderFormat не реализован для типа hyper::header::common::authorization::Authorization<hyper::header::common::authorization::Bearer> [E0277]

Глядя на реализацию, мне кажется, что это правильно:

https://github.com/hyperium/hyper/blob/master/src/header/common/authorization.rs

impl<S: Scheme + Any> HeaderFormat for Authorization<S> where <S as FromStr>::Err: 'static {
    fn fmt_header(&self, f: &mut fmt::Formatter) -> fmt::Result {
        if let Some(scheme) = <S as Scheme>::scheme() {
            try!(write!(f, "{} ", scheme))
        };
        self.0.fmt_scheme(f)
    }
}

https://github.com/auth0/rust-api-example/issues/1

1 ответ

Решение

Глядя на документацию для Authorization мы можем видеть, что это действительно реализует Header:

impl<S: Scheme + Any> Header for Authorization<S>
    where S::Err: 'static

Таким образом, вы были на правильном пути. Я предполагаю, что вы столкнулись с чем-то более коварным: несколько версий одного ящика.

В частности, версия никеля, которую я сегодня составил (0.7.3), зависит от гипер 0.6.16. Однако, если я добавлю hyper = "*" на мой Cargo.toml, тогда я также получаю новейшую версию гипер - 0.7.0.

Какими бы не интуитивно понятными ни казались вещи из гипер 0,7 несовместимы с предметами из гипер 0,6. Это ничего особенного в гипер тоже; это верно для всех ящиков.

Если вы обновите свою зависимость для того, чтобы привязать ее к той же версии Hyper, которую хочет никель, тогда вам стоит пойти дальше.


Cargo.toml

# ...

[dependencies]
hyper = "0.6.16"
nickel = "*"

SRC /main.rs

extern crate nickel;
extern crate hyper;

use hyper::header::{Authorization, Bearer};
use nickel::{HttpRouter, Request};

fn foo(request: Request) {
    // Get the full Authorization header from the incoming request headers
    let auth_header = match request.origin.headers.get::<Authorization<Bearer>>() {
        Some(header) => header,
        None => panic!("No authorization header found")
    };
}

fn main() {}
Другие вопросы по тегам